2017-07-26 76 views
0

這似乎是一件小事,但我不是C++的專家,我還沒有找到一個好的在線解決方案。我懷疑我錯過了一些可能解決此問題的基本編碼結構。我在我的主頭文件一個如下定義:避免定義,但不使用靜態常量類

static const Foo INVALID_FOO = {}; 

其中Foo是一個POD類(它不具有構造函數,因爲它是在聯合使用在C++ 03的項目)。這似乎很好,除了源,其中包括了頭,但不使用INVALID_FOO,我收到了警告:

error: 'Foo::INVALID_FOO' defined but not used [-Werror=unused-variable] 

我試圖消除static但後來我得到重複的定義。我可以將它作爲前向聲明,並將其定義在.c文件中,但編譯器需要通過引用訪問它,並且無法進行任何優化。我也想不要禁用-Wall編譯器標誌。我想知道是否有一個很好的方法來做到這一點?

+1

我不知道C++ 17的內聯可以幫助嗎? – Bathsheba

+0

您是否希望在每個[*翻譯單元*](https://en.wikipedia.org/wiki/Translation_unit_(編程))中定義「INVALID_FOO」?爲什麼不簡單地在頭文件中聲明*並在源文件中定義(它實際使用的地方)? –

+0

@Someprogrammerdude:我幾乎按照「回答問題」的方式回答了這個問題,但我的印象是,OP意識到了這一點。 – Bathsheba

回答

3

可以抑制GCC警告這樣的:

static const Foo INVALID_FOO __attribute__ ((unused)) = {}; 

注意unused是正確的在這裏,它的作用是,它取消警告(和它仍然是細到引用標識符)。還有一個used屬性,它禁止警告告訴GCC在目標文件中發出定義,即使編譯器在源代碼中沒有看到對它的引用 - 在大多數情況下,這會導致不必要的代碼膨脹。

+0

謝謝,這正是我正在尋找。 – blackghost

+1

小修正 - '__attribute __((unused))'必須在'='之前,否則會出現編譯錯誤('expected,或;'__attribute __''之前)。可能是gcc版本的東西... – blackghost

+0

使用C++ 17也可以使用標準'[[maybe_unused]]'[attribute](http://en.cppreference.com/w/cpp/language/attributes)(或'[[gnu :: unused]]',因爲GCC還不能識別'maybe_unused')。 –

0

您可以使用static_cast<void>(INVALID_FOO);聲明來移除警告。

另請注意,static const在全局和命名空間範圍有點重言 - const使它成爲static,因此static是多餘的。