C 如何在宏中有条件地包含#ident指令?

C 如何在宏中有条件地包含#ident指令?,c,gcc,macros,c-preprocessor,C,Gcc,Macros,C Preprocessor,gcc-4.4中的一个错误导致#ident指令发出警告。我们的编译器(-Werror)中不允许出现警告,所以在某些GCC编译器版本上编译时,我需要关闭这些警告。(见附件) 由于这些代码出现在多个位置,我想用一个宏来替换它们,该宏在那些“坏”编译器上有条件地不发出任何代码(或近似于#ident),或者在所有其他编译器上发出实际的#ident指令。理想情况下,类似这样的情况: # test2.c #ifndef HAS_HASH_IDENT # define IDENT(x) //-- NO-OP

gcc-4.4中的一个错误导致
#ident
指令发出警告。我们的编译器(-Werror)中不允许出现警告,所以在某些GCC编译器版本上编译时,我需要关闭这些警告。(见附件)

由于这些代码出现在多个位置,我想用一个宏来替换它们,该宏在那些“坏”编译器上有条件地不发出任何代码(或近似于
#ident
),或者在所有其他编译器上发出实际的
#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"
$gcc-4.5-E test.c
#1“测试c”
# 1 ""
# 1 ""
#1“测试c”
#标识“gcc-4.3.3中出现故障”

也许您只想使用此选项

-fno ident
忽略
#ident
指令


可能这也会关闭警告。

您是否尝试过选择性地禁用该特定警告?类似于

的东西如果你打算编辑每一次出现的
#ident
,为什么不把它们放在
#ifdef
中呢?我知道你在GCC4.4上有问题,但也在使用4.5。这个bug还存在吗?这是什么样的错误?@fazo错误是有人在gcc 4.4中将#ident指令标记为不推荐的。这在GCC4.5中得到了纠正,因此只有在安装了GCC4.4的机器上,这才是我的问题。但是我有几十个开发人员使用这个共享代码,我不想总是解释同一个解决方案(安装GCC4.5)。但我的问题实际上是关于宏化#ident指令。您可以让生成系统复制受影响的文件,从副本中删除
#ident
,然后编译这些文件。非常黑,但应该有用。好主意,但没用<代码>$gcc-4.4-fno ident-c test.c
test.c:1:警告:#ident是不推荐使用的gcc扩展
$ 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"