【发布时间】:2014-07-29 17:07:03
【问题描述】:
我有一些基于编译器标志定义的宏。我正在尝试决定是否希望将宏定义为 (void)0 或将其未定义并导致编译时错误。
即
#ifdef DEBUG
#define PRINTF(...) printf(__VA_ARGS__)
#else
#define PRINTF(...) (void)0
#endif
int main(void) {
...
PRINTF("something");
...
}
对比
#ifdef DEBUG
#define PRINTF(...) printf(__VA_ARGS__)
#endif
int main(void) {
...
#ifdef DEBUG
PRINTF("something");
#endif
...
}
我不确定我更喜欢哪种技术。一方面,用#ifdef 包装每个 PRINTF 语句会很丑陋。另一方面,如果我调用了一个在上下文中不能真正工作的函数,那么在编译时就知道会很好。
我认为决定因素将是 (void)0 宏是否会影响可执行文件的大小。
编译代码时,(void)0 会发生什么?如果 PRINTF 被定义为 (void)0,这是否意味着可执行文件将包含某种 (void)0 指令,还是会被完全忽略?
【问题讨论】:
-
(void)0可能不会生成任何代码。 -
如果您有疑问,为什么不直接忽略它,我的意思是,定义?您真的可以将
#else定义单独写为#define PRINTF(...),而您的行(希望我在这里)只是;s,即空语句。 -
#define PRINTF(...)有什么问题(您将宏替换定义为空字符串) -
为什么你要问一个只有特定编译器才能回答的问题,而在任何时候都不说你的编译器是什么?
-
@PascalCuoq 我认为 (void)0 的处理将是跨 c 编译器的标准。我正在使用 Code Composer Studio IDE,这让我对我正在使用的编译器有些不知所措。
标签: c macros compiler-construction