36

次のコードをコンパイルしようとするまで、私は C 構文をよく知っていると思っていました。

void f(int i; double x)
{
}

コンパイラがトリップすることを期待していましたが、実際にエラー メッセージが表示されません。

test.c:1:14: error: parameter ‘i’ has just a forward declaration

私はそれから試しました

void fun(int i; i)
{
}

失敗する

test.c:1:17: error: expected declaration specifiers or ‘...’ before ‘i’

そして最後に

void fun(int i; int i)
{
}

驚いたことに、これは成功します。

この構文を実際の C コードで見たことはありません。その用途は何ですか?

4

2 に答える 2

33

この形式の関数定義:

void fun(int i; int i)
{
}

パラメータ前方宣言機能と呼ばれる GNU C 拡張機能を使用します。

http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

この機能により、実際のパラメーター リストの前にパラメーターの前方宣言を行うことができます。これは、たとえば、可変長配列パラメーターを持つ関数で、可変長配列パラメーターの後にサイズ パラメーターを宣言するために使用できます。

例えば:

// valid, len parameter is used after its declaration 
void foo(int len, char data[len][len]) {}  

// not valid, len parameter is used before its declaration
void foo(char data[len][len], int len) {}

// valid in GNU C, there is a forward declaration of len parameter
// Note: foo is also function with two parameters
void foo(int len; char data[len][len], int len) {}  

OPの例では、

void fun(int i; int i) {}

fun前方パラメーター宣言は、実際のパラメーターのいずれにも使用されておらず、関数定義は実際には次と同等であるため、何の目的も果たしません。

void fun(int i) {}

これは GNU C 拡張であり、C ではないことに注意してgccください-std=c99 -pedantic

警告: ISO C では前方パラメータ宣言が禁止されています [-pedantic]

于 2013-07-21T10:46:06.810 に答える