如何获取所有函数参数值列表并将它们链接到Visual C++中的日志记录类?

sha*_*oth 10 c++ macros logging visual-c++

我们有一大堆作为外部API公开的函数,我们需要跟踪每个调用中的所有参数值.目前我们有一个接受所有参数列表的宏:

 void SomeApiFunction( bool parameter1, const wchar_t* parameter2 )
 {
     LOG_PARAMETERS( parameter1 << parameter2 )
     //function payload
 }
Run Code Online (Sandbox Code Playgroud)

宏扩展如下:

 #define LOG_PARAMETERS( x ) GlobalLoggerObject << x;
Run Code Online (Sandbox Code Playgroud)

GlobalLoggerObject类型是class CLogger已经operator <<超载了所有可能的参数类型-是这样的:

template<class TypeToLog>
CLogger& operator << (const TypeToLog& parameter)
{
   //logging code
   return *this;
}
Run Code Online (Sandbox Code Playgroud)

这样我们就可以有任何长度和感谢的参数列表链的<<他们可以全部传递到宏观的和必要的具体版本operator <<取决于参数的类型被实例化.

很好,除了我们必须保持与周围函数完全同步的参数列表.

有没有办法一次性获取所有参数 - 像这样:

TRACE_ALL_PARAMETERS( UNIVERSAL_MAGIC )
Run Code Online (Sandbox Code Playgroud)

这样我们就不必明确列出每个参数了?

And*_*dré -2

您可以尝试使用非标准VA_ARGS宏。尽管不是标准的,但大多数编译器都支持它。

一个非常简单的方法是“字符串化”所有参数并打印它。只要有一点创造力,我相信您可以想出更好的东西:

#include <iostream>
#define ALLARGS( ... ) std::cout << #__VA_ARGS__  << std::endl;

int main( int argc, char* argv[] )
{
    ALLARGS( "two arguments", 1.0 );
    ALLARGS( "five arguments", 1.0, 1.0, true, 'c' );
}
Run Code Online (Sandbox Code Playgroud)