2014-02-25 65 views
1

我保持一个跨平台的C代码库和一些平台(的Xcode 4,红帽衍生像Fedora和Mageia发行版),我得到以下编译器错误:如何抑制阴影“索引”警告?

warning: declaration of 'index' shadows a global declaration 

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

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

那么我该如何解决这个问题呢?也就是说,在某种程度上可以检测到平台是否具有index函数并仅在那里禁用警告,或者如果它存在,我该如何重新定义它?

回答

3

这是一个错误GCC fixed in 4.8 branch

The option -Wshadow no longer warns if a declaration shadows a function declaration, unless the former declares a function or pointer to function, because this is a common and valid case in real-world code.

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

2

检查标头,其中index被声明,它可能被封装在某些#if#ifdef中,您可能会利用它来防止它被声明。

还可能有一个编译器#pragma,您可以使用它来禁用它发生的特定行上的警告。至少clang有这样的:

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

我认为gcc具有相同的,如果你有GCC替换clang。旧版本可能不支持push,我不确定警告的开关在两者中是否相同。如果它与#pragma GCC一起使用,clang也应该识别#pragma,因此您不需要重复。

为了记录在案,我没有得到通过包括<string.h>和使用-Wshadow在任Debian或者OS X定义int index;clanggcc此警告你...你确定你的index来自<string.h>?在带有XCode 5的OS X上,它位于<strings.h>(复数)。

+0

自从Xcode 5我相信我不再在OSX中获得它。我也没有在基于Debian的Linux中看到它。 – congusbongus