2012-02-15 2 views
0

J'ai un code c qui utilise vextern comme indiqué ci-dessous et je voudrais savoir ce que le but est:À quoi sert vextern dans ce code?

fichier1.c:

#define FILE1_G_ 

file1.h:

#ifdef FILE1_G_ 
# define vextern 
#else 
# define vextern extern 
#endif 

Répondre

5

Je suppose que define est utilisé pour définir des variables dans un seul fichier, mais les déclarer dans tous les fichiers qui incluent cet en-tête.

Si dans file1.h, vous avez vextern int a;, et vous inclure ce fichier dans certains fichiers .c, seront définis la a seule variable dans le fichier qui a la ligne #define FILE1_G_. (Dans votre exemple, file1.c)

+0

Je ne sais pas lequel est correct. L'autre réponse suggère que seul le mot vextern sera affecté. Donc, cela voudrait dire que int serait toujours défini? – SSS

+0

Il ne sera pas défini. Ce sera déclaré. (Lorsque vous écrivez un programme avec certains fichiers, vous ne devez définir une seule fois qu'une seule variable, mais vous devez la déclarer dans tous les fichiers qui l'utilisent.) – asaelr

2

C'est un preprocessor macro.

Si FILE1_G_ est défini, toutes les occurrences de vextern sont remplacées par extern. Sinon, ils sont enlevés (remplacés par rien)

Modifier pour CLARIFIER en fonction des commentaires ci-dessous:

Cela signifie qu'il est soit déclaré comme extern ou non; seul le mot vextern est affecté. En ce qui concerne le cas d'utilisation ... il permet à un fichier .c de définir les éléments "marqués" par vextern en définissant FILE1_G_ avant d'inclure cet en-tête.

La valeur par défaut (FILE1_G_ n'a pas été défini) signifie que le fichier .c qui est actuellement compris file1.h n'a pas défini FILE1_G_ et ne définit pas les choses qui ont été marqués avec vextern, mais il peut les utiliser parce qu'ils ont été déclarés dans cet en-tête et défini ailleurs.

+0

Donc, si le fichier .h indique: vextern void func (int X); Cela serait soit défini comme un extern void func (int x); ou void func (int x). D'une manière ou d'une autre, puisque la valeur par défaut est extern, cela serait-il inutile dans cette situation? Ou cela signifie-t-il que la ligne entière est remplacée par rien? – SSS

+0

J'ai nettoyé mon commentaire de réponse et l'ai posté comme une modification à ma réponse. –