首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >你能用C #定义一个注释吗?

你能用C #定义一个注释吗?
EN

Stack Overflow用户
提问于 2009-11-24 02:54:23
回答 12查看 21.9K关注 0票数 32

我试图做一个调试系统,但它似乎不工作。

我想要实现的东西是这样的:

代码语言:javascript
运行
复制
#ifndef DEBUG
    #define printd //
#else
    #define printd printf
#endif

有没有办法做到这一点?我有很多调试消息,我不喜欢这样做:

代码语言:javascript
运行
复制
if (DEBUG)
    printf(...)

code

if (DEBUG)
    printf(...)

...
EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2009-11-24 02:58:19

不,你不能。在预处理指令的任何处理开始之前,注释都会从代码中删除。因此,您不能在宏中包含注释。

此外,任何试图在以后使用任何宏技巧来“形成”注释的尝试都不能保证有效。编译器不需要将"late“注释识别为注释。

实现所需功能的最佳方法是在C99中使用带有变量参数的宏(或者,也可以使用编译器扩展)。

票数 32
EN

Stack Overflow用户

发布于 2009-11-24 03:07:59

一个常见的技巧是这样做:

代码语言:javascript
运行
复制
#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;
}

通过这种方式,您可以使用printf()的全部功能,但您必须忍受双括号才能使宏工作。

双括号的要点是:您需要一个集合来指示这是一个宏调用,但在C89中,宏中不能有不确定数量的参数。但是,通过将参数放在它们自己的一组括号中,它们会被解释为单个参数。在定义DEBUG的情况下展开宏时,替换文本是单词printf后跟singl参数,该参数实际上是括号中的几个项目。然后,这些括号被解释为printf函数调用中所需的括号,因此一切都解决了。

票数 24
EN

Stack Overflow用户

发布于 2009-11-24 03:01:41

С99方式:

代码语言:javascript
运行
复制
#ifdef DEBUG
    #define printd(...) printf(__VA_ARGS__)
#else
    #define printd(...)
#endif

好吧,这个不需要C99,但假设编译器已经为发布版本打开了优化:

代码语言:javascript
运行
复制
#ifdef DEBUG
    #define printd printf
#else
    #define printd if (1) {} else printf
#endif
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1785205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档