我想基于宏有条件地编译代码.基本上我有一个看起来像的宏(从真实版本简化):
#if DEBUG
#define START_BLOCK( x ) if(DebugVar(#x) \
{ char debugBuf[8192];
#define END_BLOCK( ) printf("%s\n", debugBuf); }
#else
#define START_BLOCK( x ) (void)0;
#define END_BLOCK( ) (void)0;
#endif
Run Code Online (Sandbox Code Playgroud)
问题是,如果DEBUG定义了,你可以做以下事情:
START_BLOCK( test )
char str[] = "Test is defined";
strcpy(debugBuf, str);
END_BLOCK( )
START_BLOCK( foo )
char str[] = "Foo is defined";
strcpy(debugBuf, str);
END_BLOCK( )
Run Code Online (Sandbox Code Playgroud)
一切正常,因为每个块都在它自己的范围内.但是,如果未定义DEBUG,那么您将str在第二个块中重新定义.(嗯,你也debugBuf没有定义,但这只是简化例子的副作用.)
我想做的是让#else成为:
#else
#define START_BLOCK( x ) #if 0
#define END_BLOCK( ) #endif
#endif
Run Code Online (Sandbox Code Playgroud)
或者编译一些在开始/结束块之间没有任何东西的方法.我尝试了以上内容,我也尝试过以下方面:
#else
#define NULLMACRO( ... ) (void)0
#define START_BLOCK( x ) NULLMACRO(
#define END_BLOCK( ) )
#endif
Run Code Online (Sandbox Code Playgroud)
没有运气.
这有什么办法吗?我刚想到的一个想法是,我可能会滥用优化编译器并使用:
#else
#define START_BLOCK( x ) if(0){
#define END_BLOCK( ) }
#endif
Run Code Online (Sandbox Code Playgroud)
并相信它会完全编译出来.还有其他解决方案吗?
那么你想要条件块有自己的范围?
这是一个非常易读的解决方案,它依赖于编译器来优化它:
#define DEBUG 1
if (DEBUG) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是一个仅预处理器:
#define DEBUG 1
#ifdef DEBUG
#define IFDEBUG(x) {x}
#else
#define IFDEBUG(x)
#endif
IFDEBUG(
// ...
)
Run Code Online (Sandbox Code Playgroud)
或手动:
#define DEBUG 1
#ifdef DEBUG
{
// ...
}
#endif
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3859 次 |
| 最近记录: |