2015-10-22 2 views
0

J'ai un fichier d'en-tête à la directive préprocesseur définie comme suit:La valeur de la même directive préprocesseur est correcte dans un fichier et le mal dans un autre

#define X 10 
#define Y 5 
#define DIV (X/Y) 

Maintenant, j'ai deux fichiers C différents que j'ai inclus cet en-tête. Lorsque j'imprime la valeur de ceci dans ces deux fichiers, la valeur est différente! Le programme est assez volumineux et plusieurs macros de préprocesseur sont utilisées.

fichier C# 1 Valeur de DIV est 2

fichier C# 2 Valeur de DIV est 8!

Pourquoi cela se produit-il? C'est la première fois que j'ai jamais rencontré une telle erreur. Est-ce une erreur avec le compilateur ou le fichier make?

Est-ce parce que DIV est défini dans un autre en-tête? ou y a-t-il un problème beaucoup plus profond?

----------------- ----------------- Edité Plus d'info:

Il se trouve DIV lui-même n'a pas été défini à plusieurs endroits. Mais X et Y ont été dans différents dossiers du répertoire parent dans lequel beaucoup d'applications existent.

a. Evertime je fais> faire; Je suppose que la valeur des directives du préprocesseur est recalculée?

b. L'une des dépendances du fichier make peut-elle être en cause? Si l'une des dépendances a un fichier d'en-tête différent avec x, Y est-il défini?

c. Comment se comporte la compilation d'une directive de préprocesseur dans le cas d'une structure de dossiers complexe comportant plusieurs en-têtes dans des répertoires différents avec X et Y définis?

|_ Child 1 
    |_ INC 
    |_ Header 2 with x and y defined 
    |_ Program 1 -> Has Header 2 included. X and Y defined. 
|_ Child 2 
    |_ INC 
    |_ Header1 - Has X, Y & DIV defined 
    |_ Program 2 -> Has Header 1 included. Value of DIV calculated using X, Y of which header? 
    |_ Program 3 -> Has Header 1 included. Whats value of X, Y and DIV? Is it recalculated? 

Maintenant, la valeur de DIV est très bien dans l'un des programmes et faux dans un autre!

+1

Cela me semble comme DIV est redéfini. Essayez de régler DIV sur 2 et de relancer votre test. – user590028

+0

Lorsque je règle manuellement la valeur sur 2, la valeur reste la même dans les deux fichiers. Cela signifie-t-il à coup sûr qu'il est redéfini? – theCuriousOne

+1

Nous aurions besoin de voir plus de code (c'est-à-dire où la macro DIV est appelée et comment elle est utilisée) pour déterminer pourquoi vous recevez deux valeurs différentes pour ce qui est supposé être la même macro. – KillaBytes

Répondre

1

Non, ce n'est pas un bogue dans make ou le compilateur. C'est une erreur dans votre Makefile ou vos attentes. Malheureusement, les informations que vous fournissez sont déroutantes et presque inutiles. Premièrement, les identifiants dans C sont sensibles à la casse. Vous utilisez parfois x, parfois X. Ce n'est pas très diligent.

L'expansion des macros C dépend de la séquence des directives #define et #undef dans la séquence exacte, contrôlée par la séquence d'options -Idirectory. Les macros peuvent également être définies avec l'option -DX=..., en remplaçant tout ce qui se trouve dans un en-tête. Vous ne nous montrez pas la ligne de commande qui est exécutée pour émettre un jugement. Pour commencer,

find . -name '*.h' | xargs grep 'define.*X' 

devrait donner un indice où chercher les définitions de X.

+0

"contrôlé par la séquence d'options' -Idirectory' "- il serait plus exact de dire quelque chose comme" contrôlé par l'ordre que les en-têtes sont '# include'ed, et recherché dans la séquence d'options' -Idirectory' " :) – psmears

+0

@Jens: Désolé à ce sujet. L'identifiant est dans le même cas à tous les endroits. Je vais l'éditer. Le fichier Make a environ 6 répertoires inclus avec environ 10 dépendances. Merci pour l'info. Je vais regarder dans tous les répertoires d'inclure. – theCuriousOne