编译像
这样简单的东西时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
也是如此。
这是什么原因,是否有推荐的修复方法?
答案 0 :(得分:15)
您需要使用:
gcc -std=c99 -c test.c
-ansi选项相当于-std = c90。
ANSI C实际上是C的1990版本,它不包含inline
关键字。
答案 1 :(得分:11)
不,ANSI C没有inline
。
您的第二个命令实际上会覆盖-std=c99
-ansi
(它们都会影响-std=
),因此您实际上正在使用ANSI C进行编译(无C99)。
答案 2 :(得分:5)
inline关键字不是原始ANSI C标准的一部分 (C89)因此库不会导出任何内联函数定义 默认情况下。内联函数在较新版本中正式引入 C99标准,但大多数C89编译器也包括内联作为 延长了很长时间。
答案 3 :(得分:3)
在没有ansi选项的情况下工作正常的原因是因为gcc默认为'-std = gnu90',这是ANSI / C89加上扩展(其中一个,毫不奇怪,是对内联函数的支持)。如果您只需要ANSI C支持,则不需要任何选项,除非您需要严格的标准符合性(如果您的代码将在其他编译器上编译,这显然可能很有用)。