Ответ 1
Я бы сделал это, используя макрос, содержащий макросы. Что-то вроде этого даст вам то, что вы хотите:
#define QUOTEME(M) #M
#define INCLUDE_FILE(M) QUOTEME(M##_impl_win.hpp)
#include INCLUDE_FILE(module)
Я пытаюсь создать include имя файла в макросе. Это должно быть законным в С++:
#define INCLUDE_FILE "module_impl_win.hpp"
#include INCLUDE_FILE
это отлично работает, но как только я пытаюсь сгенерировать имя файла, он не компилирует
#define INCLUDE_FILE(M) M##"_impl_win.hpp"
#include INCLUDE_FILE("module")
На самом деле это дает мне предупреждение о MSVC2010
предупреждение C4067: неожиданные жетоны после директивы препроцессора - ожидается newlin
но он не включает файл.
В чем проблема? Как я могу избавиться от него?
Я бы сделал это, используя макрос, содержащий макросы. Что-то вроде этого даст вам то, что вы хотите:
#define QUOTEME(M) #M
#define INCLUDE_FILE(M) QUOTEME(M##_impl_win.hpp)
#include INCLUDE_FILE(module)
Проблема заключается в том, что в конечном итоге ваш код будет выглядеть следующим образом:
#include "module""_impl_win.hpp"
Это генерирует те же предупреждения и ошибки, которые вы видите, но несколько более очевидным образом.
Пока компилятор примет этот синтаксис, препроцессор не будет.
У меня нет предложения сделать то, что вы пытаетесь сделать. Лично не хотелось бы использовать этот тип макроса, поскольку он затрудняет навигацию по коду визуально, и это, вероятно, будет препятствовать быстрому переходу кода от редактора.
Вы также можете использовать Boost Preprocessor, особенно BOOST_PP_STRINGIZE/BOOST_PP_CAT:
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/stringize.hpp>
#define INCLUDE_FILE(M) BOOST_PP_STRINGIZE(BOOST_PP_CAT(M, _impl_win.hpp))
// expands to: #include "module_impl_win.hpp"
#include INCLUDE_FILE(module)
(cf. C Макро - Динамический #include)
Обратите внимание, что это связано с той же проблемой, что и ответ @Andrew (ведущий символ underscore = зарезервированный идентификатор).