Ben*_* B. 28 c debugging c-preprocessor
我正在尝试做一个调试系统,但它似乎不起作用.
我想要完成的是这样的事情:
#ifndef DEBUG
#define printd //
#else
#define printd printf
#endif
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?我有很多调试消息,我不想这样做:
if (DEBUG)
printf(...)
code
if (DEBUG)
printf(...)
...
Run Code Online (Sandbox Code Playgroud)
AnT*_*AnT 29
不,你不能.在开始处理任何预处理指令之前,将从代码中删除注释.因此,您无法在宏中添加注释.
此外,任何以后通过使用任何宏技巧"形成"评论的尝试都不能保证起作用.编译器不需要将"迟到"注释识别为注释.
实现所需的最佳方法是在C99中使用带有可变参数的宏(或者,可能使用编译器扩展).
Tim*_*Tim 20
一个常见的技巧是这样做:
#ifdef DEBUG
#define OUTPUT(x) printf x
#else
#define OUTPUT(x)
#endif
#include <stdio.h>
int main(void)
{
OUTPUT(("%s line %i\n", __FILE__, __LINE__));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您printf()可以获得全部功能,但您必须忍受双括号才能使宏工作.
双括号的要点是:你需要一个集来表示它是一个宏调用,但你不能在C89中的宏中有一个不确定数量的参数.但是,通过将参数放在它们自己的括号中,它们被解释为单个参数.当DEBUG定义宏时展开宏时,替换文本是单词printf后跟singl参数,实际上是括号中的几个项.括号然后被解释为printf函数调用中所需的括号,因此一切都解决了.
Xeo*_*eor 18
С99方式:
#ifdef DEBUG
#define printd(...) printf(__VA_ARGS__)
#else
#define printd(...)
#endif
Run Code Online (Sandbox Code Playgroud)
好吧,这个不需要C99,但假设编译器已为发布版本启用了优化:
#ifdef DEBUG
#define printd printf
#else
#define printd if (1) {} else printf
#endif
Run Code Online (Sandbox Code Playgroud)
小智 8
你可以将所有的调试调用放在一个函数中,让它调用它printf_debug并把它放在DEBUG这个函数里面.编译器将优化空函数.
小智 6
在一些编译器(包括MS VS2010)上,这将起作用,
#define CMT / ## /
Run Code Online (Sandbox Code Playgroud)
但没有所有编译器的受赠人.
| 归档时间: |
|
| 查看次数: |
17046 次 |
| 最近记录: |