Как я могу условно включить директивы #ident в макрос? - PullRequest
3 голосов
/ 03 октября 2011

Ошибка в 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"

Ответы [ 2 ]

0 голосов
/ 05 декабря 2016

Вы пытались выборочно отключить это конкретное предупреждение? Что-то вроде https://stackoverflow.com/a/3125889/2003487

0 голосов
/ 03 октября 2011

Возможно, вы просто хотите использовать эту опцию

-fno-ident Игнорировать директиву #ident.

возможно, это также отключает предупреждение.

...