Я хочу определить макрос, основанный на некотором условии (наличие #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 не определено).
Это невозможно. Препроцессор — это очень простая вещь, он не разбирает вложенные макросы подобным образом. Второй фунт (#
) не будет восприниматься препроцессором как вложенный макрос. Аргумент в значительной степени обрабатывается как необработанная строка.
Однако вы можете посмотреть на статическое утверждение с помощью C ++ 11 и далее вместо #error
директивы. Вы бы написали тогда что-то вроде этого:
#ifdef INITED
#define MyMacro(x) x->method(); //something with x
#else
#define MyMacro(x) static_assert(false, "Not initalized!");
#endif