2010-08-10 5 views
0

Je dois fournir un fichier de configuration, qui décrira les fichiers d'en-tête STL à inclure. J'ai trouvé que généralement cela se fait en définissant beaucoup de macros HAVE_XXX_HEADER. Je me demande s'il y a quelque chose de mal à fournir explicitement le nom de l'en-tête dans une macro. Ensuite, au lieu de tester chaque variante:Y compris le fichier d'en-tête défini par la macro

#if defined(HAVE_TR1_UNORDERED_MAP_HEADER) 
#include <tr1/unordered_map> 
#elseif (...) 
#endif 

vous pouvez simplement avoir:

#define UNORDERED_MAP_HEADER <tr1/unordered_map> 
(...) 
#include UNORDERED_MAP_HEADER 

qui, en plus synonyme de flexibilité, puisque le nom d'en-tête n'est pas codé en dur dans le fichier configuré.

Répondre

2

Ceci est possible et légal en C99, cf ISO 9899: 1999 §6.10.2 exemple 2. Un exemple similaire peut également être trouvée dans le (draft) C++ standard, 16,2 balle 8.

0

J'ai essayé de faire:

#define BBB <stdlib.h> 
#include BBB 

Et il se compile bien, en utilisant MSVS 2005. Quel est le problème?

+3

Le problème est que montrer que cela fonctionne sur un compilateur particulier n'implique pas qu'il fonctionne sur tous les compilateurs standard. – GManNickG

4

Bien sûr, vous pouvez le faire. Vous pouvez également utiliser des macros de fonctions; par exemple, je l'utilise dans mes projets parce que les lieux de gcc têtes TR1 dans un sous-répertoire:

#ifdef __GNUC__ 
# define TR1_HEADER(header) <tr1/header> 
#else 
# define TR1_HEADER(header) <header> 
#endif 

#include TR1_HEADER(unordered_map) 
#include TR1_HEADER(memory) 
#include TR1_HEADER(functional) 
// etc. 

#undef TR1_HEADER 

J'ai testé sur gcc et MSVC 2008. D'autres compilateurs peuvent exiger d'autres hacks, bien que dans ce cas particulier gcc n'est pas strictement conforme alors que MSVC est, donc devrait travailler hors de la boîte.