2016-01-15 40 views
1

我想在我的項目中使用thread_local關鍵字。但是,並非所有支持-std=c++11的編譯器都支持thread_local。我能否知道是否有辦法確定編譯時是否支持thread_local?我試着用Google搜索,但沒有找到答案。確定編譯時是否支持thread_local關鍵字

+1

[This](http://stackoverflow.com/questions/5047971/how-do-i-check-for-c11-support)不會告訴你,如果'thread_local'被支持,但你可以告訴如果C++ 11正在使用。 – NathanOliver

+0

通常的方法是使用thread_local,如果它不編譯,然後抓住任何宏來識別給定的編譯器,並使用ifdef-s來替換它的工作。 – marcinj

+5

通常的技術(使用linux安裝包)是運行一個配置腳本,它嘗試編譯一個小代碼片段並檢查編譯器的退出狀態。然後生成一個配置頭文件,其中包含一些定義,告訴你可以在代碼中使用什麼,以及哪些不能使用。 –

回答

2

但是,並非所有支持-std=c++11的編譯器都支持thread_local

根據this reference他們需要符合C++ 11標準。

所以你的問題基本上歸結爲確定你的代碼的一部分是否編譯了-std=c++11選項或不是,這已經很好answered here


如果您看到特定的操作系統環境的差異/ C++編譯器實現,我建議你運行一個預編譯腳本,該探針特定的編譯器的能力,並且爲你生成一個config.h頭。

包括這個頭可以被用於確定,如果特定功能可用,你可以把你的頭文件和源文件適當

#if defined(FEATURE) 
    // feature specific code 
#else 
    // plain code 
#endif 


爲了支持我已經介紹了一種選擇,也有GNU automake tools,支持生成這樣的探測腳本。它可用於支持各種目標平臺。

+1

你的回答表明你從來沒有在蘋果的小丑中編譯過鏗鏘的mac,他們已經盡力去銷燬它。 :/ –

+1

@RichardHodges不,我其實沒有。但實際上它需要通過符合C++ 11的編譯器來實現。那麼你提到的那些有bug?這將需要額外的'#ifdef'來排除,除非這個問題得到解決。 –

+0

@πάνταῥεῖ,至少有一個被廣泛使用的東西,它被認爲是C++ 11的一致性,但卻忽略了C++ 11的所有線程特殊部分。也就是說,mingw和他們提供的gcc版本。 – SergeyA