2013-07-21 16 views
24

Myślałem, że znam składni C całkiem dobrze, dopóki nie próbowałem skompilować następujący kod:Co to jest deklaracja przekazania parametru?

void f(int i; double x) 
{ 
} 

spodziewałem kompilator do podróży, i to zrobił, ale nie pojawia się komunikat o błędzie:

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

następnie próbowałem

void fun(int i; i) 
{ 
} 

który kończy się niepowodzeniem z

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

i wreszcie

void fun(int i; int i) 
{ 
} 

które, ku mojemu zdziwieniu, udaje!

Nigdy nie widziałem tej składni w prawdziwym kodzie C. Jakie jest jego zastosowanie?

+0

Co jest Twój kompilator? Chyba jest to błąd lub rozszerzenie (nie kompiluje się z _clang 2.8_). – md5

+0

@ md5: GCC. Przepuszcza również '-std = c99'; Chyba powinienem był spróbować CLang, które wycieczki. –

Odpowiedz

23

Ta forma definicji funkcji:

void fun(int i; int i) 
{ 
} 

wykorzystuje rozszerzenie GNU C zwany parametru deklaracji naprzód funkcję.

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

Funkcja ta pozwala mieć parametrów forward deklaracji przed faktycznym listy parametrów. Może to być używane na przykład w przypadku funkcji z parametrami tablicy o zmiennej długości do zadeklarowania parametru wielkości po parametrze tablicy o zmiennej długości.

Na przykład:

// 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) {} 

W przykładzie OP

void fun(int i; int i) {} 

zgłoszenie parametr do przodu nie jest bezcelowe, ponieważ nie stosuje się żadnego z tych rzeczywistych parametrów i funkcji fun definicja jest w rzeczywistości odpowiednikiem:

void fun(int i) {} 

Uwaga ta jest rozszerzeniem GNU C i nie jest C. Kompilacja z gcc i -std=c99 -pedantic dałby oczekiwanych diagnostyczne:

ostrzegawcze: ISO C zabrania przodu deklaracje parametrów [-pedantic]

+2

Tak! że teoria ISO, +1 do ciebie i żałuję, że nie mogłem zrobić +5 do OP za przełamanie barier, spróbuj czegoś niezwykłego, przynajmniej dla mnie :) – 0decimal0