带有变量参数的c++调试宏,不带格式字符串
Debug macro for C++ with variable arguments without the format string
是否可以编写一个宏,它可以接受可变数量的参数,并像这样展开:
quickdebug(a) -> cout << #a ": " << a;
quickdebug(a,b) -> cout << #a ": " << a << #b ": "<< b;
等如果没有,我是否可以至少打印所有参数而不给出格式字符串?如
quickdebug2(a) -> cout << a ;
quickdebug2(a,b) -> cout << a << " " << b ;
等例如,在java中,我可以写一个函数来提供类似的功能:
void debug(Object...args)
{
System.out.println(Arrays.deepToString(args));
}
通过使用覆盖的类,operator:
class VariadicToOutputStream
{
public:
VariadicToOutputStream(std::ostream& s, const std::string& separator = " ") : m_stream(s), m_hasEntries(false), m_separator(separator) {}
template<typename ObjectType>
VariadicToOutputStream& operator , (const ObjectType& v)
{
if (m_hasEntries) m_stream << m_separator;
m_stream << v;
m_hasEntries=true;
return *this;
}
~VariadicToOutputStream()
{
m_stream << std::endl;
}
private:
std::ostream& m_stream;
bool m_hasEntries;
std::string m_separator;
};
你可以这样写:
VariadicToOutputStream(std::cout) , 1, 0.5f, "a string";
然后可以用预处理器宏包装:
#define VARIADIC_TO_STDOUT(...) VariadicToOutputStream(std::cout),__VA_ARGS__;
所以你可以写:
VARIADIC_TO_STDOUT(1, 0.5f, "a string");
在参数之间添加分隔符字符串是很容易的。
编辑:我只是添加了一个默认的空格作为分隔字符串。
可以创建可变的宏,从而接受可变数量的参数。语法类似于函数:
#define quickdebug(...) functiontocall("test", __VA_ARGS__)
在参数列表中最后一个命名参数之后列出的任何参数将在__VA_ARGS__
中列出,包括任何分隔逗号。
则:quickdebug(1, 2, "123", 4.5)
变为functioncall("test", 1, 2 , "123", 4.5)
但是在某些时候你需要使用这些参数,如果你没有一个格式字符串,或者其他指示参数类型的东西,这就会变得非常困难。
问题是,当从变量参数列表中读取变量时,您需要知道参数的类型,或者至少它的大小。如果我是你,我会选择不同的方法。
您可以在这里阅读更多关于可变宏的信息:http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
相关文章:
- 是否可以从格式字符串中检索"width"
- 我应该如何从 stdin C++ 中读取可变长度的格式字符串?
- 从用户定义的类生成格式字符串?
- 如何连接格式字符串?
- 如何在C++中将"%Y%m%d"格式字符串转换为time_t变量?
- CPPCHECK C++成员函数上的格式字符串
- scanf() 语句中"%*[^n]"的格式字符串指示什么?分配抑制器 (*) 和否定扫描集 ([^) 如何协同工作?
- 自定义 {fmt} 格式化函数,具有编译时格式字符串检查功能
- '|' scanf 格式字符串是什么意思
- 如何使用 msgfmt 验证格式字符串中的位置表示法占位符
- sscanf_s:格式字符串"%d"需要类型为"int *"的参数,但可变参数 4 的类型为"WORD *"
- C4477: 'fprintf' :格式字符串 '%s' 需要类型为"char *"的参数,但可变参数 1 的类型为"int *"
- 如何使用OpenSSL API从其PEM格式字符串中读取RSA公钥
- C 格式字符串宏
- C++等效于 C 的格式字符串
- 如何使用 C++ 中的 rapidjson 库从 json 格式字符串中获取值
- _vsnprintf和_vsnprintf_s的格式字符串中的可用百分比字符
- 如何将格式字符串发送到iostream
- 跨平台格式字符串
- 使用 swprintf() 打印"0x0"的格式字符串应该是什么?