Ошибка в gcc-4.4 заставляет директиву #ident
выдавать предупреждение.Мы не разрешаем предупреждения в нашем компиляторе (-Werror), поэтому мне нужно отключить их при компиляции на определенных версиях компилятора GCC.(См. Лучшая замена для GCC # идент. )
$ echo '#ident "FAILS on gcc-4.3.3"' > test.c
$ gcc-4.4 -c test.c
test.c:1: warning: #ident is a deprecated GCC extension
Поскольку они происходят в нескольких местах, я хочу заменить их макросом, который условно испускает либо ничего (либо что-то, что приближается *)1007 *) на этих "плохих" компиляторах или с действительной директивой #ident
на всех остальных.В идеале, что-то вроде этого:
# test2.c
#ifndef HAS_HASH_IDENT
# define IDENT(x) //-- NO-OP
#else
# define IDENT(x) #ident x
#endif
Это не работает, потому что препроцессор дросселирует #
из #ident
, так как он интерпретируется как оператор stringize при использовании в макросе.
$ gcc-4.5 -Wall -E test2.c
test2.c:4:22: error: '#' is not followed by a macro parameter
Я попробовал несколько приемов перенаправления макросов, но ничего из того, что я придумал, не удовлетворило бы препроцессор.
Возможно ли что-то подобное даже так?
Примечание:Директива #ident
передается препроцессору без изменений, поэтому проблема, с которой я столкнулся, заключается в том, что не ограничено каким-либо ограничением рекурсии препроцессора.
$ gcc-4.5 -E test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"
#ident "FAILS on gcc-4.3.3"