你可以在C中定义评论吗?

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)

  • @AndreyT:尽管这个问题已经很老了,并且已经得到回答,但是我对您的评论很感兴趣。您能否提供或指出一个示例,其中调试代码在发行版中可能无效?非常感谢你。 (2认同)

小智 8

你可以将所有的调试调用放在一个函数中,让它调用它printf_debug并把它放在DEBUG这个函数里面.编译器将优化空函数.

  • 这并不会禁用参数的评估,也不会禁止参数有效的要求(例如,声明).换句话说,它不会按要求执行. (2认同)
  • 问题是如果参数在发布上下文中无效,它就不会编译.它不会达到"优化". (2认同)

小智 6

在一些编译器(包括MS VS2010)上,这将起作用,

#define CMT / ## /
Run Code Online (Sandbox Code Playgroud)

但没有所有编译器的受赠人.