Как сделать так, чтобы компиляция остановилась, если в моем исходном файле используется константа? - PullRequest
6 голосов
/ 24 июня 2019

Я хочу проверить использование константы в исходном файле и, если она используется, остановить компиляцию.

Указанная константа определена в универсальном файле драйвера, от которого наследуется ряд реализаций драйвера. Однако его использование устарело, поэтому последующие обновления каждого драйвера должны переключаться на использование нового вызова метода, а не на использование этого постоянного значения.

Очевидно, это не работает

#ifdef CONST_VAR
#error "custom message"
#endif

Как я могу сделать это элегантно? Поскольку это int, я могу определить CONST_VAR как строку и позволить ей потерпеть неудачу, но это может затруднить разработчикам понимание того, что на самом деле пошло не так. Я надеялся получить хорошее сообщение типа #error.

Есть предложения?


Ядовитый ответ здесь превосходен. Однако для более старых версий VC ++, которые не поддерживают [[не рекомендуется]], я обнаружил следующие работы.

Используйте [[deprecated]] (компиляторы C ++ 14) или __declspec(deprecated)

Чтобы воспринимать это предупреждение как ошибку в модуле компиляции, поместите следующую прагму в верхнюю часть исходного файла.

#pragma warning(error: 4996)

* * Например, тысяча двадцать-три
const int __declspec(deprecated) CLEAR_SOURCE = 0;
const int __declspec(deprecated("Use of this constant is deprecated. Use ClearFunc() instead. See: foobar.h"));

1 Ответ

7 голосов
/ 24 июня 2019

AFAIK, стандартного способа сделать это не существует, но препроцессоры gcc и clang имеют #pragma poison, что позволяет вам делать это - вы объявляете определенные токены препроцессора (идентификаторы, макросы) как отравленные иесли они встречаются во время предварительной обработки, компиляция прерывается.

#define foo
#pragma GCC poison printf sprintf fprintf foo
int main()
{
  sprintf(some_string, "hello"); //aborts compilation
  foo; //ditto
}

Для предупреждений / ошибок после предварительной обработки вы можете использовать атрибут C ++ 14 [[устаревший]] , чьи предупреждения вы-Werror=deprecated-declarations.

int foo [[deprecated]];
[[deprecated]] int bar ();

int main()
{
    return bar()+foo;
}

может привести к ошибкам в clang / gcc. Этот второй подход, очевидно, не будет работать на макросах препроцессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...