【问题标题】:How can I conditionally include #ident directives in a macro?如何有条件地在宏中包含#ident 指令?
【发布时间】: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


【解决方案1】:

也许你只是想使用这个选项

-fno-ident 忽略#ident 指令。

也许这也会关闭警告。

【讨论】:

  • 好主意,但没有奏效。 $ gcc-4.4 -fno-ident -c test.ctest.c:1: warning: #ident is a deprecated GCC extension
【解决方案2】:

您是否尝试过选择性地忽略该特定警告?类似于https://stackoverflow.com/a/3125889/2003487

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    相关资源
    最近更新 更多