2010-09-10 9 views
2

Je voudrais passer un MSVC++ 2008 macro dans mon programme via un /D définir comme siPasser un chemin absolu comme directive de préprocesseur sur la ligne de commande du compilateur

/D__HOME__="\"$(InputDir)\"" 

alors dans mon programme que je pouvais faire ce

cout << "__HOME__ => " << __HOME__ << endl; 

qui devrait imprimer quelque chose comme

__HOME__ => c:\mySource\Directory 

mais il ne lik pas e les barres obliques arrière, donc je reçois effectivement:

__HOME__ => c:mySourceDirectory 

Avez-vous des idées sur la façon dont cela pourrait fonctionner?

MISE À JOUR: J'ai finalement eu ce à travailler avec la réponse de Tony ci-dessous mais notez que la $(InputDir) contient une barre oblique inverse donc la définition de macro réelle doit avoir une barre oblique inverse supplémentaire pour manipuler ... carriole si jamais je l'ai vu !

/D__HOME__="\"$(InputDir)\\"" 
+0

Ceci est une question de commande/shell, pas une question C++. –

Répondre

2

Vous pouvez convertir votre macro en chaîne en la préfixant avec l'opérateur de chaînage #. Cependant, cela ne fonctionne que dans les macros. Vous avez réellement besoin d'une double-macro pour le faire fonctionner correctement, sinon il ne fait qu'imprimer __HOME__.

#define STRINGIZE2(x) #x 
#define STRINGIZE(x) STRINGIZE2(x) 
cout<< "__HOME__ => " << STRINGIZE(__HOME__) << endl; 

macros Incidemment contenant des doubles underscores sont réservés à la mise en œuvre en C++, et ne doivent pas être utilisés dans votre programme.

+0

Salut merci pour le pointeur Anthony et j'ai changé le define en HOME_DIR, cependant je reçois une "erreur C2014: la commande du préprocesseur doit commencer en tant que premier espace non-blanc" en utilisant votre solution. –

+0

J'ai modifié mon commentaire pour le faire correctement avec le double tour de macro. –

+0

Notez que si vous utilisez déjà Boost, vous pouvez utiliser BOOST_PP_STRINGIZE. – BenC

Questions connexes