2014-07-11 14 views
5

per un errore di battitura, lascio lo a lì. Quando sono andato per la compilazione, il compilatore ha riferito:Dovrebbe int a, f() compilare {}?

missing a ',' between declaration of 'a' and 'f'

codice:

int a 
f(void) 
{ 
} 

ed era molto surpresing dal momento che non ho mai ottenuto alcun messaggio di errore come questo e non sapevo ho potuto mettere una virgola lì e appena compilato bene (in più di un compilatore che ho provato):

int a, 
f(void) 
{ 
} 

ma naturalmente non era mia intenzione, ma invece di int f(void){}. Io do una prova in un altro compilatori, ma non ha funzionato e ha segnalato un errore di sintassi come questo (in clang):

error: expected ';' after top level declarator.

La mia domanda è: quale è corretto? dovrebbe o non dovrebbe essere compilato? cosa dice lo standard di quel comportamento?

Non lo userò poiché è un po 'brutto mettere la variabile e le funzioni divise per virgola (proprio come per un prototipo di funzione). Sono solo curioso.

MODIFICA: aggiunto void nel parametro funzione. In realtà volevo scrivere una funzione con parametri vuoti

+2

L'ex _seems_ è valido C89 e quest'ultimo non è valido. Per C99, sono abbastanza sicuro, entrambi non sono validi (e gcc si rifiuta di compilare con '-std = c99 -pedantic'). 'int a, f();' (quest'ultima è una dichiarazione di funzione (la funzione che prende il numero non specificato di argomenti che restituiscono 'int') senza definizione) tuttavia, sarebbe valida C99. A quale standard sei interessato? – mafso

+0

Bello sapere, rimuoverò il mio commento, perché in realtà non significa dire più di quanto ha fatto il tuo, ma in qualche modo nella rilettura, lo hai detto più pulito di me. –

risposta

3

No, non dovrebbe compilare

È necessario

int a; 
void f(void) 
{ 
} 

i vuoti non sono la parte più importante in questo momento nel tempo. La parte più importante è che non hai inserito un punto e virgola dopo a.

Quando non mettere un punto e virgola dopo int a il compilatore mantiene leggere nelle prossime righe come parte della dichiarazione int, quindi non rilevare che avevi due cose che si voleva, ma piuttosto una cosa molto strana come

int a f() { } 

Aggiungendo una virgola, non è stato ancora risolto il problema; perché, una virgola indica un elenco che sarebbe un modo valido per dichiarare una lista di interi

int a, b; 

è valida fino ad esaurimento

int a, f() { } 

non è perché f() { } non è un nome valido per un numero intero. Personaggi come questo potrebbero essere validi in altri posti, ma il precedente a, impedisce che sia valido anche lì. La combinazione di quello che doveva essere due linee impedisce di essere valida C.

Ma con l'aggiunta di un punto e virgola, ora si ottengono due cose sensibili in C.

int a; 
f() { } 

consiglio vivamente che ogni funzione la scrittura ha un valore di ritorno, anche se non restituisce nulla.

int a; 
void f() { } 

e nuovo, è una pratica molto buona per indicare esplicitamente che la funzione non accetta parametri, così

int a; 
void f(void) { } 

che equivale a

int a; 
void f(void) 
{ 
} 
+0

'C89' definizione della funzione? –

+0

C99 non consente una dichiarazione vuota all'ambito del file (come nei tuoi due penultimo esempi, il ';' dopo la chiusura '}' del corpo della funzione 'f'). E stai parlando di _declarations_, non di dichiarazioni (non ci sono istruzioni sullo scope del file). – mafso

+0

@FiddlingBits: 'void f() {}' è una definizione di funzione valida in C89/C90, in C99 e in C11. In tutte e tre le versioni del linguaggio, è preferito 'void f (void) {}'. (La parola chiave 'void' e la sintassi del prototipo sono state introdotte in C89.) –

4

Ciò avverrebbe essere un errore di sintassi. La sintassi per una definizione di funzione è

//  int    f()        {} 
declaration-specifiers declarator declaration-list[opt] compound-statement 

Non c'è spazio per a, prima f() (sto basando questo su un progetto di C11 casuale). Per C89 sembra simile, tranne che declaration-specifiers è facoltativo (a causa della regola implicit-int).

0

grammatica La lingua non consente una funzione di definizione di apparire come parte di un dichiarazione . Che cosa si può fare è scrivere

int a, f(void); 

perché questa è solo una dichiarazione di per f.


1. Cioè, non c'è alcun percorso dalla dichiarazione non terminale al funzione definizione non-terminale; vedere l'Appendice A di online C standard

Problemi correlati