Конкатенация с препроцессором C ++ - PullRequest
0 голосов
/ 11 марта 2012

Я пытаюсь заставить препроцессор сгенерировать список, на основе которого были определены имена.Примерно так

#define LIST "Start of list!"

#ifdef WITH_FOO
#define LIST LIST "Foo"
#endif

#ifdef WITH_BAR
#define LIST LIST "Bar"
#endif

#define LIST LIST "End of list!"

Из этого я получаю некоторые предупреждения о переопределении LIST, а затем в коде, где я пытаюсь использовать LIST, выдается ошибка: «LIST не был объявлен в этой области»что, за исключением предупреждений, я считаю, что это должно быть.

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

Ответы [ 2 ]

3 голосов
/ 11 марта 2012

Вы можете использовать несколько вспомогательных макросов:

#ifdef WITH_FOO
#  define LIST_FOO "Foo"
#else
#  define LIST_FOO
#endif

// ... ditto for BAR

#define FOO "Start of list!" LIST_FOO LIST_BAR "End of list!"
1 голос
/ 11 марта 2012

Вы не можете построить значение макроса постепенно, как это в C или C ++ с препроцессором.

Вы можете совершить некоторые незначительные чудеса с препроцессором - см. Библиотеку Boost Preprocessor дляпризнаки того, что возможно.Но даже это, я думаю, не обеспечивает ту функциональность, которую вы ищете.

...