在API中导出常量的正确方法

时间:2012-02-09 11:33:40

标签: c++ windows visual-studio api-design

以下示例中显示的两个解决方案中的哪一个从我的API(Windows DLL)导出常量的正确方法,为什么它是更好的替代方案?

标头文件

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文件中定义一次,而不是在包含头文件的每个链接单元中定义。如我错了请纠正我。虽然它缺乏可读性......

2 个答案:

答案 0 :(得分:3)

使用第二个解决方案时,编译器将在使用API​​编译应用程序时知道常量。这可以允许编译器执行更多优化。

第一个解决方案的优点是您可以在不使用API​​重新编译应用程序的情况下更改常量。

答案 1 :(得分:3)

我认为这些解决方案根本不相同。

一个定义编译时常量,一个定义常量值。从编译器的角度来看,这些在优化方面是不同的:例如,在解决方案1的情况下,(10+AKTION_FEHLER_DATENBANK)可以进行编译时评估,但在解决方案2的情况下则不能。

但是更重要的情况是它们不能互换使用,例如: case AKTION_FEHLER_DATEBANK:在案例1中是合法的,但在案例2中则不合法。

同样适用于char Array[AKTION_FEHLER_DATEBANK]