2009-09-09 5 views
5

J'ai besoin de savoir que la directive #define en C++ déclare un label global? Par global, je veux dire visible dans tous les fichiers?Pré-processeur C++ #define

J'utilise Visual Studio 2008, (devinez si cela importe)

Répondre

9

Non, seulement dans l'unité de traduction en cours.

I.e. chaque fichier qui a #define, ou inclut un fichier qui a le #define verra la définition.

Modifier, pour répondre à votre commentaire: pour obtenir une définition dans chaque fichier, soit le mettre dans un en-tête qui est inclus partout, soit utiliser une option du compilateur pour obtenir des définitions ajoutées.

par exemple. pour gcc on ferait

gcc -Dthedefine=itsvalue 

Je ne sais pas comment on spécifie une telle inclusion dans VC++, mais je suis sûr que c'est possible d'une façon ou d'une autre.

+0

hmmmm, comment puis-je faire que globale dans tous les fichiers? – akif

+2

#include "Global.h" dans chaque fichier. – Goz

+0

inclure votre fichier d'en-tête aveC# définir dans chaque fichier. Pensez à utiliser l'en-tête précompilé ... – SadSido

1

Il ne sera que défini dans le fichier que vous définissez ou dans les fichiers contenant ce fichier

3

Le remplacement de la directive #define jeton-chaîne pour toutes les ultérieures occurrences d'un identifiant dans le fichier source. L'identificateur est remplacé uniquement lorsqu'il forme un jeton. Par exemple, l'identificateur n'est pas remplacé s'il apparaît dans un commentaire , dans une chaîne, ou comme partie d'un identificateur plus long.

Il est pas global, il est juste pour le fichier en cours/source

define in msdn

2

Symbole, défini par "#define" est visible depuis la place de la directive à la fin de la traduction unité (ou au "#undef" le plus proche pour ce symbole). Par exemple, si vous définissez quelque chose dans le fichier "file.h", ce symbole est vu dans "file.h" et dans chaque fichier, qui inclut "file.h", direct ou indirect ...

1

vous avez défini dans un fichier ne sera visible dans un autre fichier que si vous avez inclus le fichier avec la macro, donc ce n'est pas automatiquement global. En règle générale, pour cette raison, les macros doivent être définies dans vos fichiers d'en-tête de manière à pouvoir faire un #include "headerFile.h".

1

Une directive #define fera la définition à partir de ce moment, jusqu'à ce que la compilation soit terminée - gardez à l'esprit que chaque .cpp compte comme une unité de compilation séparée.

Pour définir quelque chose à travers les fichiers sources, il aurait besoin d'être dans un fichier d'en-tête que tous les fichiers source sont

2

#define ne fonctionne que dans l'unité de traduction, il est défini. Avec les fichiers d'en-tête partagés entre les unités de traduction, qui pourrait être plusieurs fichiers. Cependant, pour le rendre vraiment global, vous avez besoin d'une extension Visual Studio. L'option de ligne de commande/D vous permet de passer l'équivalent de #define au préprocesseur, et vous pouvez les placer dans votre page de propriétés de votre projet.C'est presque "aussi global que possible"; Pour les solutions multi-projets, vous pouvez utiliser des feuilles de propriétés de projet héritées partagées.

1

Vous pouvez également configurer une feuille de propriétés de studio visuel, qui est soutenue par un fichier .vsprops, et l'affecter aux projets pertinents de votre solution. Cela vous permet de gérer facilement les paramètres courants de nombreux types sur plusieurs projets, même s'ils se trouvent dans des fichiers de solutions discrètes.

http://msdn.microsoft.com/en-us/library/a4xbdz1e%28VS.80%29.aspx

Questions connexes