2016-10-27 1 views
-2

J'ai un fichier d'en-tête hérité dans mon projet C++ qui est connu pour être correct. Cela a fonctionné à divers endroits dans la base de code sans problèmes.Le fichier d'en-tête fonctionne bien dans un #include, provoque des erreurs de syntaxe dans un autre

Il fait glisser dans beaucoup d'autres en-têtes avec ce que je pense pourrait faire partie de la question:

/* legacy.h: */ 

#include "A.h" 
#include "B.h" 

// (Some definitions I need) 


/* A.h: */ 

#include "C.h" // The rabbit hole continues for another few layers 


/* B.h */ 

#include <windows.h> 
#include "D.h" // Again, this also pulls in more things 

J'ai écrit un nouveau module dans ce projet qui a également travaillé très bien pendant des semaines :

/* module.h */ 

// Status codes for new module 
struct Status { 
    enum Enum   
    { 
     ALL_GOOD = 0, 
     ERROR 
    }; 
}; 


/* module.cpp */ 

#include "module.h" 

// (Code that previously didn't require the legacy header) 

Aujourd'hui, j'ai fait un ajout relativement petit qui nécessitait de tirer dans l'en-tête hérité.

Tout à coup, rien ne se compile! Je reçois des centaines d'erreurs de syntaxe confusion tels que:

erreur C2143: erreur de syntaxe: manquant « } » avant « constante »

Weirdly, ces erreurs vont commencer sur des lignes différentes dans les deux module.h ou module.cpp selon l'ordre dans lequel j'essaie d'utiliser les en-têtes. Le pire, c'est que le problème ne semble pas avoir de rapport avec mon nouveau code dans module.cpp. Heck, je suis même revenu à la version qui avait fonctionné pendant des semaines. Cela fonctionne toujours, mais la seconde que j'inclus legacy.h, tout se casse!

Que se passe-t-il ici? Tant mon module et cet en-tête sont connus pour fonctionner très bien ailleurs, alors comment pourraient-ils causer syntaxe erreurs lorsqu'ils sont réunis?

+1

Quelle est l'erreur? BTW, n'assumez jamais un code pour être "connu pour être bon" * juste parce qu'il "a travaillé" pendant des années sans problèmes. – zvone

+0

Pourriez-vous expliquer les downvoters? J'ai ouvert la question parce qu'une telle chose m'aurait sauvé une journée de travail complète si j'avais rencontré le problème. Les symptômes étaient mystifiants, mais la cause première était simple et me donnait l'impression d'être stupide. J'ai délibérément essayé de le mettre dans les termes que je cherchais tout en ayant le problème, mais j'aimerais l'améliorer pour être plus généralement utile. – Bear

Répondre

3

Vous semblez être victime d'une macro de préprocesseur quelque part dans la chaîne d'inclusion de legacy.h. Je parie que les erreurs de syntaxe proviennent de la première utilisation du statut :: erreur comme mentionné dans votre tête:

/* module.h */ 

// Status codes for new module 
struct Status { 
    enum Enum   
    { 
     ALL_GOOD = 0, 
     ERROR // <- Syntax errors appear here 
    }; 
}; 

Dans ce cas, le contrevenant est probablement

/* B.h */ 

#include <windows.h> 

Je pense que windows.h a une macro appelée ERROR. Envisagez d'utiliser un schéma de dénomination différent de toutes les majuscules pour vos définitions d'énumération, car les programmeurs #defining d'une macro choisiront souvent de tels noms.