带有变量参数的c++调试宏,不带格式字符串

Debug macro for C++ with variable arguments without the format string

本文关键字:格式 字符串 c++ 变量 参数 调试      更新时间:2023-10-16

是否可以编写一个宏,它可以接受可变数量的参数,并像这样展开:

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