Создать имя включаемого файла в макросе - PullRequest
20 голосов
/ 20 января 2011

Я пытаюсь сгенерировать имя включаемого файла в макросе.Это должно быть допустимо в C ++:

#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

, но не содержит файл.

проблема?Как от этого избавиться?

Ответы [ 3 ]

19 голосов
/ 20 января 2011

Я бы сделал это, используя макрос цитирования помощника. Нечто подобное даст вам то, что вы хотите:

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

#include INCLUDE_FILE(module)
4 голосов
/ 26 января 2014

Вы также можете использовать 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)

(ср. C Макрос - динамический #include)

Обратите внимание, что это страдает той же проблемой, что и ответ @ Эндрю (начальное подчеркивание = зарезервированный идентификатор).

3 голосов
/ 20 января 2011

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

#include "module""_impl_win.hpp"

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

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

...