[英]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));
}
通过使用覆盖的类,运算符:
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");
在参数之间添加fi分隔符字符串会很容易。
编辑:我刚刚添加了一个默认空格作为分隔符字符串。
可以创建一个可变参数的宏,从而获取可变数量的参数。 语法类似于函数的语法:
#define quickdebug(...) functiontocall("test", __VA_ARGS__)
参数列表中最后一个命名参数后面列出的任何参数都将列在__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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.