gpt4 book ai didi

C++ 宏有条件地编译代码?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:16 24 4
gpt4 key购买 nike

我想根据宏有条件地编译代码。基本上我有一个看起来像的宏(从真实版本简化而来):

#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

问题是,如果定义了 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( )

一切正常,因为每个 block 都在它自己的范围内。但是,如果未定义 DEBUG,那么您将在第二个 block 中重新定义 str。 (好吧,您还会得到 debugBuf not defined 但这只是简化示例的副作用。)

我想做的是让#else 像这样:

#else
#define START_BLOCK( x ) #if 0
#define END_BLOCK( ) #endif
#endif

或者其他一些不编译开始/结束 block 之间的任何东西的方法。我尝试了上面的方法,我也尝试了一些类似的方法:

#else
#define NULLMACRO( ... ) (void)0
#define START_BLOCK( x ) NULLMACRO(
#define END_BLOCK( ) )
#endif

没有任何运气。

有什么办法可以实现吗?我刚刚想到的一个想法是我可能会滥用优化编译器并使用:

#else
#define START_BLOCK( x ) if(0){
#define END_BLOCK( ) }
#endif

相信它会完全编译出 block 。还有其他解决方案吗?

最佳答案

所以你想要有自己范围的条件 block ?

这是一个非常可读的解决方案,它依赖于编译器对其进行优化:

#define DEBUG 1

if (DEBUG) {
// ...
}

这是一个仅用于预处理器的:

#define DEBUG 1

#ifdef DEBUG
#define IFDEBUG(x) {x}
#else
#define IFDEBUG(x)
#endif

IFDEBUG(
// ...
)

或手动:

#define DEBUG 1

#ifdef DEBUG
{
// ...
}
#endif

关于C++ 宏有条件地编译代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7372448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com