# ошибка внутри #define — возможно в C ++ (генерировать ошибку при вызове макроса MyMacro, если некоторая константа не определена)?

Я хочу определить макрос, основанный на некотором условии (наличие #define INITED, а не параметр макроса) вернет значение или сгенерирует ошибку компилятора, например:

#error Not initialized!

Я пытался (для myIdea.h):

#ifdef INITED
#define MyMacro(x) x->method(); //something with x
#else
#define MyMacro(x) #error Not initalized!
#endif

Но этот код генерирует ошибку (не тот, который я хотел) expected macro format parameter,

Обратите внимание, что я не хочу этот код (работает, но делает немного другое):

#ifdef INITED
#define MyMacro(x) x->method(); //something with x
#else
#error Not initalized!
#endif

Приведенный выше код выдаст ошибку только тогда, когда INITED не будет определен. Я хочу генерировать только ошибку когда я звоню MyMacro() И INITED еще не был определен.

Я не раб первого кода, но я хочу, чтобы результат работал точно так, как я описал выше (генерировать ошибку при вызове макроса MyMacro ЕСЛИ константа inited не определено).

4

Решение

Это невозможно. Препроцессор — это очень простая вещь, он не разбирает вложенные макросы подобным образом. Второй фунт (#) не будет восприниматься препроцессором как вложенный макрос. Аргумент в значительной степени обрабатывается как необработанная строка.

Однако вы можете посмотреть на статическое утверждение с помощью C ++ 11 и далее вместо #error директивы. Вы бы написали тогда что-то вроде этого:

#ifdef INITED
#define MyMacro(x) x->method(); //something with x
#else
#define MyMacro(x) static_assert(false, "Not initalized!");
#endif
5

Другие решения


По вопросам рекламы [email protected]