2014-02-25 66 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