【发布时间】:2011-11-30 03:21:53
【问题描述】:
gcc-4.4 中的一个错误导致#ident 指令发出警告。我们不允许在编译器中出现警告 (-Werror),因此在某些 GCC 编译器版本上编译时,我需要关闭这些警告。 (见Best replacement for GCC #ident)
$ 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
由于这些发生在多个位置,我想用一个宏替换它们,该宏将有条件地在那些“坏”编译器上不发出任何东西(或近似于 #ident 的东西)或在所有其他编译器上使用实际的 #ident 指令。理想情况下,是这样的:
# test2.c
#ifndef HAS_HASH_IDENT
# define IDENT(x) //-- NO-OP
#else
# define IDENT(x) #ident x
#endif
这不起作用,因为预处理器阻塞了#ident 的#,因为它在宏中使用时被解释为字符串化运算符。
$ 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"
【问题讨论】:
-
如果您无论如何都要编辑
#ident的每一个出现,为什么不将它们括在#ifdef中? -
我看到您在使用 gcc 4.4 时遇到问题,但也在使用 4.5。这个bug还存在吗?它是什么类型的错误?
-
@fazo 错误是有人在 gcc 4.4 中将 #ident 指令标记为已弃用。这在 gcc 4.5 中得到了纠正,所以只有在安装了 gcc 4.4 的机器上这对我来说是个问题。但是我有几十个开发人员使用这个共享代码,我不想总是解释相同的解决方案(安装 gcc 4.5)。但我的问题实际上是关于宏化 #ident 指令。
-
您可以让您的构建系统复制受影响的文件,从副本中删除
#ident并编译这些文件。非常hacky,但应该可以工作。
标签: c gcc macros c-preprocessor