2010-07-15 4 views
1

Je possède ce fichier C++ (appelons-le main.cpp):Comment exclure certaines directives #include du flux C++?

#include <string> 
#include "main.y.c" 
void f(const std::string& s) { 
    yy_switch_to_buffer(yy_scan_string(s.c_str())); 
    yyparse(); 
} 

Le fichier dépend de main.y.c, qui doit être généré à l'avance au moyen de bison util. En d'autres termes, je ne peux pas compiler le fichier main.c si j'oublie de lancer bison main.y avant. Et c'est parfaitement OK, c'est comme ça que je le veux. Maintenant, je suis en train de construire à partir Makefile fichier .d, en utilisant cette commande:

$ c++ -MM main.c > main.d 
main.cpp:2:10: error: main.y.c: No such file or directory 

Je ne ici, puisque main.y.c est pas encore prêt. Je pense que je devrais en quelque sorte citer ma directive #include dans le fichier main.c pour le rendre invisible pour le processus c++ -MM.

+1

Je ne connais pas beaucoup 'bison' donc ma question pourrait être stupide mais ... y compris un fichier' .c' semble faux. Est-ce vraiment le moyen de travailler avec 'bison'? N'avez-vous pas un fichier '.h' équivalent? – ereOn

+0

Oui, c'est comme ça que bison fonctionne si vous avez besoin de placer son résultat dans un autre fichier C++. De par sa nature, le bison est pour C, pas pour C++. Ainsi, c'est un truc pour le faire fonctionner dans le projet C++. Au moins, je comprends de cette façon .. – yegor256

+0

En fait, je peux inclure le fichier '.h', mais ce fichier est également généré automatiquement par' bison' .. Donc, le remplacement de '.c' par' .h' ne résoudra pas le problème – yegor256

Répondre

1

Vous pouvez indiquer dans votre makefile main.c dépend de main.y.c de sorte qu'il va exécuter le processus bison avant d'essayer de compiler main.c. Comme alternative (ce que je pense n'est probablement pas ce que vous voulez faire) est que vous pouvez avoir votre makefile passer une macro au compilateur pour indiquer si oui ou non main.y.c existe et utiliser une directive #if pour inclure (ou non) main.y.c.

#if EXISTS_MAIN_Y_C 
#include "main.y.c" 
#endif 
+0

La chose macro ne cachera-t-elle pas le vrai problème? Si le fichier n'est pas généré mais nécessaire de toute façon, ne pas l'inclure rendra le vrai problème moins évident. – ereOn

+0

@ereOn: c'est pourquoi j'ai dit que ce n'était probablement pas une bonne solution. Je n'aurais probablement pas dû ajouter cela ... Il y a des moments où vous pourriez vouloir inclure conditionnellement un en-tête qui pourrait ou ne pourrait pas être sur une plate-forme. Dans ce cas, vous pouvez inclure du code qui contient des implémentations personnalisées de la fonctionnalité de plate-forme manquante. autoconf est couramment utilisé pour configurer les macros qui vous permettent de faire cela, mais vous avez raison, ce n'est pas vraiment ce dont cet utilisateur a besoin ici. –

3

Cela ressemble à un travail pour un fichier makefile. Vous pouvez définir les dépendances telles que main.c dépend de main.y.c, et main.y.c a une règle pour le construire à partir du code bison.