Подтвердить что ты не робот

Создать имя файла в макросе

Я пытаюсь создать 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

но он не включает файл.

В чем проблема? Как я могу избавиться от него?

4b9b3361

Ответ 1

Я бы сделал это, используя макрос, содержащий макросы. Что-то вроде этого даст вам то, что вы хотите:

#define QUOTEME(M)       #M
#define INCLUDE_FILE(M)  QUOTEME(M##_impl_win.hpp)

#include INCLUDE_FILE(module)

Ответ 2

Проблема заключается в том, что в конечном итоге ваш код будет выглядеть следующим образом:

#include "module""_impl_win.hpp"

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

Пока компилятор примет этот синтаксис, препроцессор не будет.

У меня нет предложения сделать то, что вы пытаетесь сделать. Лично не хотелось бы использовать этот тип макроса, поскольку он затрудняет навигацию по коду визуально, и это, вероятно, будет препятствовать быстрому переходу кода от редактора.

Ответ 3

Вы также можете использовать 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 = зарезервированный идентификатор).