如何抑制阴影“索引”警告?

时间:2014-02-25 23:40:11

标签: c compiler-warnings suppress-warnings string.h

我维护了一个跨平台的C代码库,在几个平台上(Xcode 4,Red Hat派生的发行版,如Fedora和Mageia),我得到以下编译器错误:

warning: declaration of 'index' shadows a global declaration

基于this answer,我理解这是因为一些基于BSD的C实现在index中定义了一个非标准string.h函数,这意味着每当我声明时都会显示此警告一个index变量。我向你保证,我没有任何全球index变量。

我知道我可以避免命名任何index,但它是一个语义上有用的名称,所以我最终在整个地方使用它。我知道我也可以抑制此警告,例如在GCC中使用-Wno-shadow,但我不想全局禁用其他有用的编译器警告。

那我怎么解决这个问题呢?也就是说,是否有可能检测平台是否具有index功能并仅在那里禁用警告,或者如果它存在,我该如何重新定义?

2 个答案:

答案 0 :(得分:3)

这是GCC错误fixed in 4.8 branch

  

如果声明影响函数声明,则选项-Wshadow不再发出警告,除非前者声明函数或指向函数的指针,因为这是实际代码中常见且有效的情况。

这不再是Mageia 4(GCC 4.8.2)或Fedora 19(GCC 4.8.1)和20(GCC 4.8.2)中的问题,但我不知道任何干净的解决方案以避免警告除了更改变量名称,可能更具体。

答案 1 :(得分:2)

检查声明index的标题,它可能包含在您可能利用的某些#if#ifdef中,以防止它被声明。

可能还有一个编译器#pragma可用于在发生的特定行上禁用警告。至少clang有这个:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"
// code that produces warning
#pragma clang diagnostic pop

如果您将gcc替换为clang,我认为GCC具有相同的效果。较旧的版本可能不支持push,我不确定警告的开关是否相同。如果它适用于#pragma GCC,则clang也应该识别#pragma,因此您无需复制。

对于记录,我没有收到此警告,包括<string.h>并使用int index;clang使用{{1}在Debian或OS X上定义gcc你确定-Wshadow来自index吗?在带有XCode 5的OS X上,它位于<string.h>(复数)。