2009-04-05 6 views
1

Je m'interrogeais sur les petites différences entre les déclarations de prototypes de fonctions dans les en-têtes et dans les fichiers .c. J'ai un en-tête avec quelques fonctions de prototypes et quelques fichiers .c avec une implémentation réelle de ces fonctions. J'ai fait quelques changements dans l'en-tête, seulement ajouté le qualificatif "__restrict" (reconnu par gcc). Ma question est que je dois mettre le qualificatif "__restrict" dans les fichiers .c à (actuellement le code compile donc je suppose que la réponse est non, mais une précision serait appréciée).C: différences entre la déclaration du prototype dans l'en-tête et la déclaration de la fonction pour la mise en œuvre?

Est-ce que cela fonctionne pour tous les qualificatifs C? Puis-je ajouter "const" ou "volatile" dans l'en-tête sans avoir à faire la même chose dans les fichiers .c?

actuellement en tête:

int myfunc_gettype (const mytype *__restrict, int *__restrict); 

et dans le fichier de mise en œuvre:

int myfunc_gettype(const mytype *attr, int *type) 

Répondre

5

Vous doit. La discordance invoque un comportement indéfini. Y at-il une raison pour laquelle vous voulez avoir des déclarations séparées dans l'en-tête et à la définition? Notez bien, que le mot-clé est restrict par opposition à __restrict qui est une extension du fournisseur (indice: regardez le _ avant le nom du mot-clé). Vous devriez vous en tenir à la version standard pour la portabilité.

+0

en fait, le mot-clé est C99 restreindre et le __restrict est attraper juste en gcc avec je suppose que le même résultat. – claf

+0

Je ne suis pas sûr de comprendre, si j'ai le qualificatif restrict dans l'en-tête et non dans l'implémentation, le pointeur sera-t-il "restreint" de toute façon ou non? – claf

+0

Vous appelez UB. Cela peut en fait entraîner la restriction du pointeur. Le mot clé standard C++ est 'restrict', pourquoi utiliser __restrict? – dirkgently

-2

REMARQUE: Vous n'avez pas réellement ajouté le qualificateur «restrict». Vous avez juste différents noms de variables (facultatifs) dans le prototype. En ce qui concerne votre question, la plupart des bons compilateurs C vont attraper ce bug et lancer un avertissement/erreur si le prototype non-concordant est inclu # avec l'implémentation. Si vous avez des prototypes incompatibles, vous pouvez voir des problèmes allant du crash subtil au crash instantané.

+0

vous voulez dire __restrict est un nom de variable optionnel Le Prototype? Je suis sûr que vous avez tort avec gcc. – claf

+0

En fait, j'avais raison: "Le mot-clé restrict est un qualificatif de type pour les pointeurs et fait partie du standard C99. Dans un code qui ne peut pas être compilé avec C99, utilisez __restrict ou __restrict__ pour activer le mot-clé comme extension GCC " – claf

+0

Depuis sa compilation, il doit s'agir simplement d'un qualificatif; vous ne pouvez pas avoir deux arguments avec le même nom. Je me suis demandé au début, mais je pense que cet argument est décisif - en supposant que le code compile tel que revendiqué. –

-1

Avec gcc 4.0.1, cela dépend si la const est 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; } 
+0

Il irrite même la communauté SO pour provoquer une downvote. –

+0

La question n'était pas "est-ce légal" ou même "est-ce une pratique acceptable"; c'était "ça va marcher". –

Questions connexes