c预编译器对定义为(void)0的宏做了什么
发布时间:2020-12-16 10:34:51 所属栏目:百科 来源:网络整理
导读:我有一些基于编译器标志定义的宏.我正在尝试决定是否要将宏定义为(void)0或将其定义为未定义并导致编译时错误. 即 #ifdef DEBUG #define PRINTF(...) printf(__VA_ARGS__)#else #define PRINTF(...) (void)0#endifint main(void) { ... PRINTF("something");
我有一些基于编译器标志定义的宏.我正在尝试决定是否要将宏定义为(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; 是一个没有副作用的表达式语句.任何理智的实现都会优化这个语句(实现可以用这样的语句做什么?). 如果定义了NDEBUG,则将(void)0作为宏定义得到C标准的认可,因为它出现在(C11)7.2p1中,用于断言宏定义: #define assert(ignore) ((void)0) 注意定义: #define PRINTF(...) (void)0 代替 #define PRINTF(...) 有一个优势.在第一种情况下,您有一个表达式(就像一个不返回值的函数),因此它可用于例如逗号表达式或条件表达式中. 例如: // Comma expression printf("test"),PRINTF("Hi Dennis"); // Conditional expression test-expr ? perror("Hello") : PRINTF("world"); 这两个表达式语句仅对前PRINTF定义有效(带(void)0). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |