1

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

warning: declaration of 'index' shadows a global declaration

基于这个答案,我知道这是因为一些基于 BSD 的 C 实现定义了一个非标准index函数,string.h这意味着每当我声明一个index变量时都会出现这个警告。我向你保证,我没有任何全局index变量。

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

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

4

2 回答 2

3

检查index声明的标头,它可能被包裹在一些中,#if或者#ifdef您可以利用它来阻止它被声明。

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

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

我认为gcc如果你替换clangGCC. 旧版本可能不支持push,我不确定两者的警告开关是否相同。如果它与#pragma GCC,一起工作,clang也应该识别 ,#pragma所以你不需要复制。

作为记录,我没有通过在 Debian 或 OS X 上包含<string.h>和定义使用或使用…你确定你来自吗?在带有 XCode 5 的 OS X 上,它是(复数)。int index;clanggcc-Wshadowindex<string.h><strings.h>

于 2014-02-25T23:46:57.763 回答
3

这是4.8 分支中修复的 GCC 错误

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

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

于 2014-03-15T16:27:27.880 回答