2010-02-12 2 views
1

Est-il possible d'ajouter un #define _MYDEFINE_ dans mon fichier d'en-tête en fonction de certaines options dans les paramètres du projet. Ex: Supposons que dans mon fichier d'en-tête exposée (qui est livré avec la bibliothèque) J'ai quelques macros comme indiqué ci-dessous:Est-il possible de définir une macro dans le fichier d'en-tête en utilisant des paramètres de projet ou des options de makefile?

#ifdef _MYDEFINE_ 
#define ABC 2 
#else 
#define ABC 4 
#endif 

Maintenant, tout en construisant ma bibliothèque, je peux ajouter _MYDEFINE_ dans mes paramètres, mais je ne veut pas que l'utilisateur de la bibliothèque ajoute _MYDEFINE_ dans ses paramètres de projet ou code. Au lieu de cela, je veux que "#define _MYDEFINE_" soit automatiquement ajouté au début de l'en-tête.

Note:#define _MYDEFINE_ devrait obtenir ajouté que lorsqu'il est défini dans mes paramètres de préprocesseur. Pour les autres paramètres, il ne devrait pas être ajouté.

Si ce n'est pas possible grâce aux paramètres du projet, y a-t-il des façons novatrices de le faire? Toutes les idées sont les bienvenues.

Répondre

2

Vous pourriez avoir besoin de considérer quel effet _MYDEFINE_ a sur votre bibliothèque. Si vous voulez seulement ses effets pour le développement (comme NDEBUG), l'utilisation de l'option de compilateur -D ou /D devrait suffire.

Si cela a un effet qui affectera ce qui se passe lorsque vos utilisateurs utilisent la bibliothèque, vous devrez peut-être faire quelque chose de plus élaboré. Dans ce dernier cas, vous allez créer deux versions de votre bibliothèque, et vous pouvez les nommer comme: libX-ABC2.a et libX-ABC4.a. Et vous aurez également besoin de deux versions de vos fichiers d'inclusion, et vous devrez peut-être générer des en-têtes de configuration avec _MYDEFINE_ définis de manière appropriée dans chacun d'eux. Si votre bibliothèque est installée, vous pouvez avoir besoin de répertoires d'inclusion versionnés pour les fichiers d'en-tête.

Si, par exemple, _MY_DEFINE_ affecte la disposition des structures déclarées ou la taille d'un tableau déclaré dans d'autres têtes, ayant les utilisateurs comprennent en-tête pour #define ABC 4 avec la bibliothèque qui suppose #define ABC 2, vous serez introduire quelques bugs désagréables pour vos utilisateurs traquer.

J'ai déjà vu ça. Prendre soin de cela est difficile et fastidieux, mais ne pas le faire peut créer de sérieux problèmes avec différentes versions de votre bibliothèque. Avoir un fichier d'en-tête de configuration de construction et inclure ce fichier d'en-tête avant d'inclure tout autre fichier d'en-tête.

4

La plupart des compilateurs C acceptent l'option -D pour définir un symbole:

gcc -D_MYDEFINE_ file.c 

Sous cette forme, il est implicitement fixé à un. Dans le cas contraire, on peut définir explicitement une valeur:

gcc -D_MYDEFINE_=4 file.c 

-D multiples sont autorisées, même sur les systèmes d'exploitation qui rendent si difficile (comme VMS).

gcc -DSYMBOL1 -DSYMBOL2 -DSYMBOL3 file.c 

Ces comportent comme si correspondant #define déclarations sont apparues avant la première ligne de chaque fichier de ligne de commande.

#define SYMBOL1 1 (these are virtually present due to command line -D options) 
#define SYMBOL2 1 
#define SYMBOL3 1 

(actual source code begins) 
/* 
* file.c: 
*/ 
#include <ctype.h> 
#include <stdlib.h> 
... 
0

Vous semblez être à la recherche du drapeau du compilateur «/D » (l'un des rares qui est identique dans le compilateur presque tous les C sur la planète). Utilisation serait quelque chose comme: cc /D_MYDEFINE_ myfile.c

En tant sans lien de côté, notez qu'un nom comme _MYDEFINE_ qui commence par un trait de soulignement suivi d'un autre trait de soulignement ou une lettre majuscule est réservée à la mise en œuvre - à savoir que vous n'êtes pas censé utiliser une telle chose.

+0

J'ai juste ajouté _MYDEFINE_ comme exemple. Je ne nomme vraiment pas mes constantes de cette façon. Mais, est-ce que/D ajoute la définition à votre fichier d'en-tête exposé? Je parle du point de vue d'une bibliothèque avec des fichiers d'en-tête exposés qui seront utilisés par certaines applications. – Jay

+0

@Jay: Non, le "/ D" serait typiquement dans le makefile, pas n'importe lequel des fichiers source. Donc, fondamentalement, vous l'ajouteriez à votre makefile pour quand vous construisez la bibliothèque. –

1

Ce fichier d'en-tête de configuration de construction peut être créé en utilisant un mécanisme de script lors de la construction.

Questions connexes