c - 在没有替换字符串的情况下使用#define 会发生什么?

标签 c c-preprocessor

当尝试调试我的代码时,我用这个标记了一些 printf:

#if debug
    printf(...);
#endif

并且在文件的开头,我错误地写了 #define debug 而不是 #define debug 1

gcc 抛出以下错误:

error: #if with no expression

现在我有两个选择:

  1. 将定义更改为 #define debug 1
  2. 将 if 更改为 #ifdef debug

我知道在看到 #define debug 1 后,PP 会将我代码中的每个 debug 替换为 1,这就是为什么 #if debug 在我的代码中不起作用 - 编译器看不到任何表达式...

我的问题是,当我使用 #ifdef debug 时 - 会发生什么?我认为 debug 保存在某个地方并进行了检查,但是在哪里以及如何进行检查?

最佳答案

其实很简单:#define debug doesdebug定义为空。它仍然是定义的。空宏不同于不存在的宏。 #undef debug 将删除宏。

#ifdef 不关心这个值。它只检查宏是否定义为任何内容。如果您不关心该值,请始终使用 #ifdef

关于c - 在没有替换字符串的情况下使用#define 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45184529/

相关文章:

c - 如何在 C 中干净地终止线程?

c++ - L-Value,指针运算

c - 这个 "makes integer from pointer without a cast"在定义中安全吗?

c - #if defined MACRO 是否等同于#ifdef MACRO?

java - 我想将此 C 代码转换为 java 代码,但我在输入数组时遇到问题

c - Linux 命令真的是 C 目标文件吗?

c - 使用带有千位分组格式(撇号)的 ICC 和 printf 的警告

haskell - GHCI 配置文件可以使用 CPP 宏吗?

C 预处理器可以执行算术运算吗?如果可以,如何执行?

c - 我们如何编写 C 宏来将强制转换插入函数调用?