ANSI-C不知道内联关键字吗?

时间:2012-08-28 00:04:46

标签: c inline c89

编译像

这样简单的东西时
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 个答案:

答案 0 :(得分:15)

您需要使用:

gcc -std=c99 -c test.c

-ansi flag specifies c90

  

-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编译器也包括内联作为   延长了很长时间。

引自Gnu website

答案 3 :(得分:3)

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