gpt4 book ai didi

命令行与代码中的 C 宏定义

转载 作者:行者123 更新时间:2023-12-02 08:34:05 25 4
gpt4 key购买 nike

考虑以下玩具程序(将其命名为 Foo.c),并观察 #define FOO 被注释掉了。

#include <stdio.h>

// #define FOO
int main(){
#if FOO
printf("Foo\n");
#else
printf("Bar\n");
#endif
}

使用以下两个命令行可以很好地编译。

 gcc -o Foo Foo.c
gcc -DFOO -o Foo Foo.c

但是,如果我们取消注释 #define FOO 行,并使用 gcc -o Foo Foo.c 进行编译,则会生成编译器错误。

Foo.c:5:8: error: #if with no expression
#if FOO
^
  1. 命令行中的-DFOO和代码中的#define FOO有什么区别?
  2. 为什么命令行定义有效但内联定义导致编译器错误?

注意:我知道可以使用#ifdef 和/或#define FOO 1 纠正此行为。这个问题的目的是请求解释,而不是解决

最佳答案

在 GCC 的命令行中,-DFOO-DFOO=1 的简写。演示:

#include <stdio.h>

// #define FOO
int main(){
#if FOO
printf("Foo %d\n", FOO);
#else
printf("Bar %d\n", FOO);
#endif
}

现在只能使用 -DFOO(或使用显式值 -DFOO=-32768,或使用 #define FOO 1 进行编译或类似的)。

$ gcc -o md -DFOO md.c && ./md
Foo 1
$

这实际上是 POSIX 标准要求的 c99

-D name[=value]
Define name as if by a C-language #define directive. If no =value is given, a value of 1 shall be used. The -D option has lower precedence than the -U option. That is, if name is used in both a -U and a -D option, name shall be undefined regardless of the order of the options.

因此它基本上可以在任何地方使用。

关于命令行与代码中的 C 宏定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23523115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com