我维护了一个跨平台的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
功能并仅在那里禁用警告,或者如果它存在,我该如何重新定义?
答案 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>
(复数)。