即
#ifdef DEBUG #define PRINTF(...) printf(__VA_ARGS__)#else #define PRINTF(...) (voID)0#endifint main(voID) { ... PRINTF("something"); ...}
与
#ifdef DEBUG #define PRINTF(...) printf(__VA_ARGS__)#endifint 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 Expressionprintf("test"),PRINTF("Hi Dennis");// Conditional Expressiontest-expr ? perror("Hello") : PRINTF("world");
这两个表达式语句仅对前PRINTF定义有效(带(voID)0).
总结以上是内存溢出为你收集整理的c预编译器对定义为(void)0的宏做了什么全部内容,希望文章能够帮你解决c预编译器对定义为(void)0的宏做了什么所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)