【问题标题】:Using #define in C with no value在 C 中使用 #define 没有价值
【发布时间】:2014-06-12 22:53:23
【问题描述】:

如果#define 没有任何值,比如

#define COMMAND_SPI()

默认是0吗?

【问题讨论】:

  • 究竟是什么阻止了您自己运行预处理器并查看会发生什么?
  • 请注意,您已经定义了一个类似函数的宏,这意味着COMMAND_SPI 不会被扩展,除非它后面跟着一个带括号的参数列表。
  • @KerrekSB 一个系统在一个测试用例中的行为并不能保证所有系统的行为都相同(甚至相同的代码在同一系统上重新运行时行为相同)
  • @MattMcNabb:另一方面,观察到即使 one 符合系统 not0 替换宏也会立即破坏 OP 的假设.

标签: c macros


【解决方案1】:

不,它的评估结果为零。从字面上看,符号被替换为空。

然而,一旦你有了#define FOO,预处理器条件#ifdef FOO现在就为真了。

另请注意,在gcc 和可能的其他编译器中,如果您在命令行上使用-DFOO 定义一个宏,则默认计算为1


由于 OP 更新了他的问题以引用类似函数的宏,让我们考虑一个小例子。

#define FOO
#define BAR()


FOO
BAR
BAR()

这不是一个有效的C 程序,但预处理器并不关心。 如果我用gcc -E Input.c 编译它,我会得到一个空白,然后是BAR,然后是另一个空白。这是因为第一个和第三个表达式的计算结果为空,而中间的表达式没有展开,因为它后面没有()

【讨论】:

  • 最后一段是特定于编译器的; gcc 的行为方式是这样,但语言没有指定。对于 gcc 和类似的编译器,您可以通过在命令行上传递 -DFOO= 来执行 #define FOO 的等效操作。
  • @KeithThompson,感谢您的警告。我会把它折叠成答案。
  • 请注意,POSIX 要求 c99 提供 -D 行为:-D name[=value] 定义名称就像使用 C 语言 #define 指令一样。如果没有给出= value,则应使用值1。 -D 选项的优先级低于-U 选项。也就是说,如果在-U-D 选项中都使用了名称,则无论选项的顺序如何,名称都应该是未定义的。编译器可能会提供其他实现定义的名称。实现应支持至少 2048 个字节的 -D 定义和 256 个名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 2013-03-06
  • 2011-03-19
相关资源
最近更新 更多