Что ж, с помощью 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
| ^~~~~~~~