如果使用#define
而不带有值,例如
#define COMMAND_SPI()
默认情况下它会取值0吗?
#define FOO
,预处理器条件语句#ifdef FOO
就会变为真。gcc
和可能其他编译器中,如果你在命令行上用-DFOO
定义了一个宏,那么默认情况下它将计算为1
。
#define FOO
#define BAR()
FOO
BAR
BAR()
这不是一个合法的C
程序,但是预处理器并不在乎。
如果我用gcc -E 输入.c
编译它,我将得到一个空白,接着是BAR
,然后又是一个空白。这是因为第一个和第三个表达式都没有结果,而中间的表达式没有被展开,因为它后面没有()
。
-DFOO =
来执行等效于#define FOO
的操作。 - Keith Thompsonc99
提供-D
行为:-D name[=value]
将name定义为C语言#define
指令一样。如果没有给出= value
,则使用值1。-D
选项的优先级低于-U
选项。也就是说,如果在-U
和-D
选项中都使用了name,则无论选项的顺序如何,name都将被未定义。编译器可以提供其他实现定义的名称。实现必须支持至少2048字节的-D
定义和256个名称。 - Jonathan Leffler
COMMAND_SPI
后面跟着带括号的参数列表,否则它不会被展开。 - Keith Thompson0
替换宏,也会立即摧毁OP的假设。 - Kerrek SB