Возможно ли препроцессор C++ испускать #error
если используется определенное #define
? Что-то вроде этого:
#define this_must_not_be_used #error You shouldn't use that.
Нет стандартного способа определения макроса таким образом, чтобы его использование, где бы оно ни было, даст вам ошибку компиляции, особенно не тот, который дает ясное и полезное сообщение об ошибке. Насколько вам известно, код, который его использует, может просто привести в соответствие его результат, или он может быть частью условия assert
которое будет удалено препроцессором.
Для большинства практических целей размещение достаточно, чтобы не быть частью действительной программы C (или C++).
Однако некоторые реализации имеют специфические для реализации методы достижения именно того, что вы просите. Например, с помощью GCC вы можете использовать
#pragma GCC poison this_should_not_be_used
где его последующее использование, независимо от того, как оно закончится, даст:
error: attempt to use poisoned "this_should_not_be_used"
Вы можете посмотреть свою собственную документацию компилятора, чтобы узнать, есть ли у нее что-то подобное. Вы также можете использовать условные определения макросов, так что с помощью GCC вы используете этот подход, с вашим компилятором вы используете свой подход к компилятору, а с неизвестным компилятором вы возвращаетесь к стандартным методам предоставления определения макросов, что, вероятно, приведет к сложному -to-read сообщение об ошибке.
В C++ 11,
#define this_must_not_be_used static_assert(false, "You shouldn't use that.");
В C11,
#define _Static_assert(0, "You shouldn't use that.");
Для C до C11 или C++ перед C++ 11 вам придется придумать другое недопустимое выражение, содержащее строку, которая будет отображаться в сообщении об ошибке. Я думаю по
#define this_must_not_be_used ("You shouldn't use that",)
static_assert
, но во многих случаях это приводит к сумасшедшим синтаксическим ошибкам, а не к ожидаемому ясному и полезному сообщению об ошибке. Например, if (this_must_not_be_used) { f(); }
выдает «error: ожидаемое первичное выражение перед static_assert» с GCC или «error: ожидаемое выражение» с clang.
static_assert
который расширяется до _Static_assert
. Вам не нужно использовать ключевое слово.
Вы имеете в виду что-то вроде следующего:
#ifdef this_must_not_be_used
#error "You shouln't use that."
#endif
this_must_not_be_used
, этот более поздний код должен получить ошибку.
#ifdef this_must_not_be_used #error You shouldn't use that. #endif
?#error
(#error
), но если цель состоит в том, чтобы перехватить программистов, которые случайно (или иным образом) используютthis_must_not_be_used
в своем коде, то вышеприведенное будет " работать ", потому что компилятор все равно выдаст ошибку!