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)