(как это сделать) получить предупреждение компилятора об устаревших / нерекомендованных функциях / конструкциях для определенного года c ++ - PullRequest
0 голосов
/ 08 июля 2019

Я ищу переключатель компилятора (или _SOME_MACRO), который будет предупреждать или запрещать функции или конструкции, которые больше не рекомендуются (хотя все еще разрешены) для «выбранного» года c ++.

например.при компиляции g ++ с ключом -std = c ++ 17 я хотел бы получить предупреждение при использовании устаревшей устаревшей конструкции "typedef" .

, то есть я хотел бы закодировать в "ортодоксальное подмножество c ++ 17 "в c ++ 17; -)

typedef int Sequence; // I would like a warning here

edit: более четко заявить о своем желании: я хотел бы запрограммировать идеальное / преобразованное подмножество c ++ 17, котороеавторы создали бы, если бы они решили игнорировать любую обратную совместимость.я знаю, что это не строго формальное и истинное изложение дел, но я верю, что этого может быть достаточно, чтобы высказать свою точку зрения.

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Что ж, с помощью gcc и некоторых злоупотреблений макросами вы можете сделать следующее:

#define typedef _Pragma("GCC warning \"typedef is deprecated in my code base\"") typedef

typedef int Sequence; // I would like a warning here

сгенерирует в gcc:

<source>:3:13: warning: typedef is deprecated in my code base
    3 |     typedef int Sequence; // I would like a warning here
      |             ^~~~~~~~~~~~~~~~~~~~~~~

Вы можете изменить это _Pragma("GCC warning \"string\"") на _Pragma("message \"string\")или действительно _Pragma("GCC error \"string\""), чтобы получить ошибку компиляции.Вы можете добавить его в качестве параметра в строку компиляции -D'typedef=_Pragma("GCC warning \"I consider typedef to be deprecated\"")'.

C ++ имеет [[deprecated]], но он не поддерживает переменную, а typedef, поэтому он не будет иметь правильного намерения.Это будет работать на большем количестве компиляторов, поэтому, если ваша команда / вы согласны с соглашением, вы можете использовать его в качестве подсказки, что вы соглашаетесь не использовать typedef в своем коде.

#define typedef [[deprecated]] typedef

typedef int Sequence; // I would like a warning here

int main() { 
    Sequence a;
}

выведетв gcc 9.1:

<source>: In function 'int main()':
<source>:6:14: warning: 'Sequence' is deprecated [-Wdeprecated-declarations]
    6 |     Sequence a;
      |              ^
<source>:3:13: note: declared here
    3 | typedef int Sequence; // I would like a warning here
      |             ^~~~~~~~
1 голос
/ 08 июля 2019

Как вы уже догадались, поскольку typedef является директивой компилятора, а не функции или класса, нет способа переопределить ее так, как вы бы использовали функцию или макрос, используя #undef, а затем переопределить.

#include <cstdio>
#undef printf

[[deprecated( “please don’t use printf!” )]]
int printf(const char *format, ...) {

Ваша лучшая ставка - привязать к вашей системе сборки линковидную ленту, чтобы предварительно обработать синтаксис. В конце концов, вы хотите дать директиву с предупреждением программисту , а не компилятору. Было бы разумно оставить компилятор компиляцией и не давать ему дополнительной работы.

Кроме того, имейте в виду, что typedef является совершенно допустимым C ++ и обладает полезностью вне псевдонимов типов, так же, как union допустим и играет свою роль даже при наличии std::variant.

Разработчики компилятора do сами добавляют эти предупреждения, когда конструкция полностью устарела комитетом по стандартам. register будет ярким примером.

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