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と同等です。

inlineANSI Cは事実上1990年版のCであり、キーワードは含まれていませんでした。

于 2012-08-28T00:07:54.163 に答える
14

いいえ、ANSICにはありませんinline

2番目のコマンドは実際にはでオーバーライド-std=c99されます-ansi(どちらもに影響します-std=)。したがって、実際にはANSI C(C99なし)を使用してコンパイルしています。

于 2012-08-28T00:07:37.723 に答える
6

inlineキーワードは、元のANSI C標準(C89)の一部ではないため、ライブラリはデフォルトでインライン関数定義をエクスポートしません。インライン関数は、新しいC99標準で公式に導入されましたが、ほとんどのC89コンパイラには、長い間、拡張機能としてインラインも含まれています。

GnuのWebサイトから引用

于 2012-08-28T00:09:14.807 に答える
4

ansiオプションがまったくなくても正常に機能する理由は、gccのデフォルトが'-std = gnu90'であるためです。これは、ANSI / C89と拡張機能です(当然のことながら、そのうちの1つはインライン関数のサポートです)。厳密な標準準拠が必要な場合を除いて、ANSI Cサポートだけが必要な場合は、オプションは必要ありません(これは、コードを他のコンパイラでコンパイルする場合に明らかに役立つ可能性があります)。

于 2012-08-28T15:51:28.543 に答える