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

C++ 在API中导出常量的正确方法,c++,windows,visual-studio,api-design,C++,Windows,Visual Studio,Api Design,下面示例中显示的两种解决方案中,哪一种是从my API(windows DLL)导出常量的正确方法?为什么它是更好的选择 头文件 namespace ExampleAPI { // Solution one extern const DWORD __declspec(dllexport) AKTION_OK; extern const DWORD __declspec(dllexport) AKTION_FEHLER; // Solution two c

下面示例中显示的两种解决方案中,哪一种是从my 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;
}
namespace ExampleAPI
{
    // Solution one
    const DWORD AKTION_OK = 0;
    const DWORD AKTION_FEHLER = 1;
}
Cpp文件

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;
}
namespace ExampleAPI
{
    // Solution one
    const DWORD AKTION_OK = 0;
    const DWORD AKTION_FEHLER = 1;
}


我认为解决方案一是更好的备选方案四,因为常数在cpp文件中只定义一次,而不是在包含头文件的每个链接单元中定义一次。如果我错了,请纠正我。尽管它缺乏可读性…

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


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

我认为这些解决方案根本不是等效的

一个定义编译时常量,另一个定义指向常量值的链接。从编译器的角度来看,这些在优化方面是不同的:例如
(10+AKTION\u FEHLER\u DATENBANK)
可以在解决方案1的情况下计算编译时,但在解决方案2的情况下不能

但是,还有一些更重要的情况是它们不能互换使用,例如:
案例AKTION\u FEHLER\u DATEBANK:
在案例1中是合法的,但在案例2中不是


类似地,对于字符数组[AKTION\u FEHLER\u DATEBANK]

我不认为一种方法比另一种更“优越”,而是个人偏好。我个人会使用你的第二个解决方案。@JoachimPileborg:你认为第二个解决方案有什么好处?这些值在API的未来版本中会改变吗?主要区别(除了第一个的丑陋之外)是第二个给客户端一个编译时常量?无论是在
还是
名称空间
接口上,它都可能是一个解决方案。好吧,最重要的是可读性,作为API的用户,我非常希望能够看到实际值是什么。