2

C でコードを記述する場合const、関数の定義に関数パラメーターの宣言を含めることがよくありますが、その宣言は含めません。

int func(int arg);

...

int func(int const arg)
{
    return arg + 1;
}

これは常に GCC と Clang を使用して問題なくコンパイルされていますが、Microchip の C18 コンパイラは型の不一致を主張しています。

規格はこれについて何を言わなければなりませんか? 非標準の拡張機能に依存していませんか?

編集:私はこれの利点について尋ねているわけではなく、想定される重複した質問のように C++ について尋ねているわけでもありません (関数パラメーターに「const」を使用する)。C 標準についてお尋ねします。これは合法的な ANSI C、C99、または C11 ですか?

4

2 に答える 2

3

関数プロトタイプの互換性について話している C11 6.7.6.3/15 を参照してください。

型の互換性と複合型の決定では、関数または配列型で宣言された各パラメーターは調整された型を持つと見なされ、修飾された型で宣言された各パラメーターは宣言された型の非修飾バージョンを持つと見なされます。

これにより、定義がプロトタイプと互換性があることが指定されます。「修飾された」とは、トップレベルのconstまたはの存在を指しますvolatile

于 2016-10-22T06:48:13.410 に答える