Генерация ошибки препроцессора, если используется определение

0

Возможно ли препроцессор C++ испускать #error если используется определенное #define? Что-то вроде этого:

#define this_must_not_be_used #error You shouldn't use that.
  • 1
    #ifdef this_must_not_be_used #error You shouldn't use that. #endif ?
  • 0
    Да и нет ... вы не можете определить макрос, который включает в себя директиву #error ( #error ), но если цель состоит в том, чтобы перехватить программистов, которые случайно (или иным образом) используют this_must_not_be_used в своем коде, то вышеприведенное будет " работать ", потому что компилятор все равно выдаст ошибку!
Теги:
c-preprocessor

3 ответа

4
Лучший ответ

Нет стандартного способа определения макроса таким образом, чтобы его использование, где бы оно ни было, даст вам ошибку компиляции, особенно не тот, который дает ясное и полезное сообщение об ошибке. Насколько вам известно, код, который его использует, может просто привести в соответствие его результат, или он может быть частью условия 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 сообщение об ошибке.

6

В 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",)
  • 1
    Я вижу, куда вы идете со static_assert , но во многих случаях это приводит к сумасшедшим синтаксическим ошибкам, а не к ожидаемому ясному и полезному сообщению об ошибке. Например, if (this_must_not_be_used) { f(); } выдает «error: ожидаемое первичное выражение перед static_assert» с GCC или «error: ожидаемое выражение» с clang.
  • 0
    C11 имеет макрос static_assert который расширяется до _Static_assert . Вам не нужно использовать ключевое слово.
2

Вы имеете в виду что-то вроде следующего:

#ifdef this_must_not_be_used
#error "You shouln't use that."
#endif
  • 2
    Я не думаю, что это то, что после ОП. Скорее, если более поздний код заканчивается использованием this_must_not_be_used , этот более поздний код должен получить ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню