15

当编译一些简单的东西时

inline int test() { return 3; }

int main()
{
 test();
 return 0;
}

gcc -c test.c一切顺利。如果-ansi添加了关键字, gcc -ansi -c test.c, 则会收到错误消息

test.c:1:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’

即使明确选择了 C99 标准也是如此,gcc -std=c99 -ansi -c test.c.

这是什么原因,是否有推荐的修复方法?

4

4 回答 4

16

你需要使用:

gcc -std=c99 -c test.c

-ansi标志指定 c90

-ansi 选项等效于 -std=c90。

ANSI C 实际上是 C 的 1990 版本,它不包含inline关键字。

于 2012-08-28T00:07:54.163 回答
14

不,ANSI C 没有inline.

您的第二个命令实际上覆盖-std=c99-ansi它们都影响-std=),因此您实际上是使用 ANSI C(非 C99)进行编译。

于 2012-08-28T00:07:37.723 回答
6

inline 关键字不是原始 ANSI C 标准 (C89) 的一部分,因此默认情况下库不导出任何内联函数定义。内联函数是在较新的 C99 标准中正式引入的,但长期以来大多数 C89 编译器也将内联作为扩展包含在内。

引用自Gnu 网站

于 2012-08-28T00:09:14.807 回答
4

完全没有 ansi 选项它工作正常的原因是因为 gcc 默认为 '-std=gnu90',这是 ANSI/C89 加上扩展(其中之一,毫不奇怪,是对内联函数的支持)。如果您只想要 ANSI C 支持,则不需要任何选项,除非您想要严格遵守标准(如果您的代码要在其他编译器上编译,这显然可能很有用)。

于 2012-08-28T15:51:28.543 回答