C: differenze tra dichiarazione di prototipo in intestazione e la funzione di dichiarazione per l'attuazione?
-
23-08-2019 - |
Domanda
Mi chiedevo di piccole differenze fra la dichiarazione di prototipi di funzione nelle intestazioni e nei file .c. Ho un colpo di testa con alcune funzioni prototipo e un alcuni file .c con implementazione reale di queste funzioni. Ho fatto alcune modifiche nell'intestazione, solo aggiunto qualificatore "__restrict" (riconosciuto da gcc). La mia domanda è devo mettere il qualificatore "__restrict" nei file .c a (attualmente il codice compilato quindi credo che la risposta è no, ma un po 'di precisione sarebbe apprezzato).
Fa questo lavoro per ogni qualificazione C? Posso aggiungere qualche "const" o "volatile" nell'intestazione, senza dover fare lo stesso nel file .c?
attualmente in intestazione:
int myfunc_gettype (const mytype *__restrict, int *__restrict);
e nel file di implementazione:
int myfunc_gettype(const mytype *attr, int *type)
Soluzione
deve . La mancata corrispondenza invoca comportamento non definito. C'è qualche motivo per cui si vuole avere dichiarazioni separate nell'intestazione e alla definizione?
Si noti bene, che la parola chiave è restrict
al contrario di __restrict
che è un'estensione vendor (suggerimento: guardare ai _
di prima del nome parola chiave). Si consiglia di attenersi alla versione standard per la portabilità.
Altri suggerimenti
Con gcc 4.0.1, dipende dal fatto che il const è inutile:
// Who cares, compiles fine, but irks the maintenance programmer.
// f.h
int f(const int i);
// f.c
int f(int i) { return i += 42; }
// No no no no Your Types Conflict gcc will not stand for it
// f.h
int f(const int *pi);
// f.c
int f(int *pi) { return (*pi)+= 42; }
NOTA: non si è effettivamente aggiunto il qualificatore 'limitare'. Devi solo diversi (opzionale) i nomi delle variabili nel prototipo.
Per quanto riguarda la tua domanda, la maggior parte buoni compilatori C prenderà questo bug e lanciare un avvertimento / errore se il prototipo non-corrispondenza è #include con l'implementazione. Se si dispone di prototipi di disadattamenti, è possibile vedere i problemi che vanno dal sottile al crollo immediato.