C: differenze tra dichiarazione di prototipo in intestazione e la funzione di dichiarazione per l'attuazione?

StackOverflow https://stackoverflow.com/questions/719189

  •  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)
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top