Включая заголовочный файл, определенный макросом - PullRequest
0 голосов
/ 11 августа 2010

Мне нужно предоставить файл конфигурации, в котором будет описано, какие файлы заголовков STL следует включить. Я обнаружил, что обычно это делается путем определения множества макросов HAVE_XXX_HEADER. Интересно, что-то не так с явным указанием имени заголовка в макросе? Тогда вместо тестирования каждого варианта:

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

Вы могли бы просто иметь:

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

, что дополнительно обеспечивает гибкость, поскольку имя заголовка не жестко запрограммировано в настроенном файле.

Ответы [ 3 ]

4 голосов
/ 11 августа 2010

Конечно, вы можете сделать это. Вы также можете использовать макросы функций; например, я использую это в своих проектах, потому что gcc помещает заголовки TR1 в подкаталог:

#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

Я проверил это на gcc и MSVC 2008. Другие компиляторы могут требовать других хаков, хотя в данном конкретном случае gcc не является строго совместимым с MSVC, поэтому должно работать "из коробки".

2 голосов
/ 11 августа 2010

Это возможно и допустимо в C99, см. ISO 9899: 1999 §6.10.2, пример 2. Аналогичный пример также можно найти в (черновом) стандарте C ++ , 16.2 bullet 8.

0 голосов
/ 11 августа 2010

Я пытался сделать:

#define BBB <stdlib.h>
#include BBB

И он прекрасно компилируется, используя MSVS 2005. В чем проблема?

...