2015-11-05 78 views
5

我想用一個簡單的編譯時間常數,例如像這樣:如何定義constexpr變量

double foo(double x) { return x + kConstDouble; } 

現在我看到至少有以下方法來定義常量

namespace { static constexpr double kConstDouble = 5.0; } 
namespace { constexpr double kConstDouble = 5.0; } 
static constexpr double kConstDouble = 5.0; 
constexpr double kConstDouble = 5.0; 

哪是正確的路要走嗎?在頭文件和源文件中定義了kConstDouble時是否有區別?

+0

所有四個都可以,你也可以'#define kConstDouble 5.0' –

回答

0

使用靜態或匿名命名空間將導致變量具有內部鏈接;它只會在同一翻譯單元中可見。因此,如果您在.cpp文件中使用其中一個,則無法在其他地方使用該變量。如果常量是該代碼單元的實現細節,那麼通常會這樣做。如果您想將其展示給其他翻譯單元,則需要將其放入一個頭文件中。這樣做的典型方法是將其聲明爲靜態(或將其放在匿名名稱空間中),因爲它是一個簡單而常量的變量。另一種方法是在頭文件中聲明它爲extern,並在.cpp中定義它以獲得一個真正的全局變量(而不是實際上每個tu都有它自己的副本的頂層變量)。

靜態和匿名命名空間之間;首先你不需要兩個。他們都做同樣的事情AFAIK。但我認爲在cpp文件中使用匿名命名空間更加通俗,因爲它們可以用來給函數,類等內部鏈接。另一方面,當你想用它來創建一個全局可用的變量時,更常見的是使用靜態;我從來沒有在頭文件中使用匿名命名空間,因爲我覺得它有誤導性。