2012-04-17 53 views
2

所以我正在寫一個庫,我想定義一個常量,它的值是pi。我正在考慮定義一個靜態const float float pi = 3.14;在一個pi.h文件中。在庫中定義一個常量變量pi

但是,我幾乎可以肯定這不是做這件事的方法,因爲我讀過你不應該在頭文件中定義變量。

我認爲的另一種方法是聲明一個內聯函數,該函數返回pi的值,但這很難使用。

另一種方式(我認爲)是把它放在pi.cc中編譯到庫中,然後使用extern static const float pi;在任何你使用pi的文件中,當然也可以將這些文件與庫鏈接起來。

這樣做的最好方法是什麼?標準庫可能會定義一個宏,但我認爲常數更好。

+0

你在哪看到M_PI?我查看了參考資料http://www.cplusplus.com/reference/clibrary/cmath/,但無法看到它。 – s5s 2012-04-17 19:05:37

+0

沒關係,它在我的實現中,但不是標準的一部分。 – chris 2012-04-17 19:06:25

+1

相關:http://stackoverflow.com/questions/1727881/how-to-use-the-pi-constant-in-c – 2012-04-17 19:07:42

回答

1

一個理由不把固定在頭文件是爲了避免重新編譯使用庫(而不僅僅是重新編碼如果常量發生變化。這個原因不適用於像程序維護時永遠不會改變的常量。

如果常量是浮點值,還有一個問題。 C++要求浮點常量具有分配給它們的存儲,並且它們將在.cpp文件中初始化,而不是在.h文件中初始化。這可以使它們的常量比等效內聯函數效率低。這就是Boost庫使用內聯函數的原因。見this answer

因此,對於您的情況,最好的辦法可能是使用Boost庫,或者如果您不想採用依賴關係,只需製作一個內聯函數即可執行相同的操作。

0

我經常看到在頭文件中定義的常量變量。你的想法對我來說似乎很合理。使其靜態似乎也可以。

1

我的建議是將常量放在頭文件中。常數會給出值類型信息,這是一件好事。

由於常量不是一個變量,它可以放在一個頭文件中。

+0

然後大概我將不得不將頭文件作爲.cc文件處理並編譯,以便我可以將它添加到庫中?這就是讓我有點懊惱的原因 - 看到.h文件被編譯成Makefile中的.cc文件:) – s5s 2012-04-17 19:11:50

+0

@ s5s,.h文件只有在.cc文件要求它時纔會編譯(通過include)。請記住, .cc文件是編譯單元。 – 2012-04-17 19:13:01

+0

@ s5s常量默認具有內部鏈接(您不需要'static') - 這意味着不管包含它的頻率如何,在頭文件中都不會有任何問題,包括它們。 – 2012-04-17 19:14:58

0

您還可以將PI常量分爲兩個文件,標題和實現。 將聲明和實現分開後,可以在不更改接口的情況下更改pi的值(例如更精確)。

這可以通過簡單的pi.h文件:

extern float pi;

和pi.c:

float pi = 3.14; 
0

我會讓static const但不extern,並將其放置在頭文件。 static const告訴編譯器它是一個只能在當前編譯單元中訪問的常量變量。這樣編譯器就可以爲它優化任何實際存儲,並直接使用該值。