2012-02-09 28 views
2

以下示例中顯示的兩個解決方案中的哪一個是從我的API(Windows DLL)中導出常量的正確方法,以及爲什麼它是更好的選擇?在API中導出常量的正確方法

頭文件

namespace ExampleAPI 
{ 
    // Solution one 
    extern const DWORD __declspec(dllexport) AKTION_OK; 
    extern const DWORD __declspec(dllexport) AKTION_FEHLER; 

    // Solution two 
    const DWORD AKTION_FEHLER_DATENBANK = 2; 
    const DWORD AKTION_FEHLER_XXX = 3; 
} 

cpp文件

namespace ExampleAPI 
{ 
    // Solution one 
    const DWORD AKTION_OK = 0; 
    const DWORD AKTION_FEHLER = 1; 
} 

我想解決一個是更好的可選擇性,因爲常量在CPP文件中定義的只有一次,不在每個包含頭文件的鏈接單元中。如我錯了請糾正我。雖然它缺乏可讀性...

+0

我不認爲一個辦法就是多「優」比其他的,而是個人喜好。我會親自使用你的第二個解決方案。 – 2012-02-09 11:39:58

+0

@JoachimPileborg:你跟第二個解決方案看有什麼優勢? – nabulke 2012-02-09 11:42:19

+0

這些值在未來的API版本中是否會發生變化?主要區別(除了第一個的醜陋之外)是第二個區別是客戶端編譯時間不變。 – 2012-02-09 11:44:37

回答

3

使用第二個解決方案,編譯器會知道的常量,編譯使用API​​的應用程序時。這可以讓編譯器執行更多的優化。

第一種方案的優點是你可以改變常數而無需重新編譯使用API​​的應用程序。

3

我沒有看到這些解決方案是等效的。

一個限定一個編譯時間常數和一個爲恆定值的鏈接。從編譯器的角度來看,這些在優化方面有所不同:例如(10+AKTION_FEHLER_DATENBANK)可以在解決方案1的情況下進行編譯時評估,但不是在解決方案2的情況下進行編譯。

但有更重要的情況不能被可互換地使用,例如: case AKTION_FEHLER_DATEBANK:是在殼體1合法的,但不區分2.

類似地,對於char Array[AKTION_FEHLER_DATEBANK]

相關問題