以下示例中显示的两个解决方案中的哪一个从我的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文件中定义一次,而不是在包含头文件的每个链接单元中定义。如我错了请纠正我。虽然它缺乏可读性......
答案 0 :(得分:3)
使用第二个解决方案时,编译器将在使用API编译应用程序时知道常量。这可以允许编译器执行更多优化。
第一个解决方案的优点是您可以在不使用API重新编译应用程序的情况下更改常量。
答案 1 :(得分:3)
我认为这些解决方案根本不相同。
一个定义编译时常量,一个定义常量值。从编译器的角度来看,这些在优化方面是不同的:例如,在解决方案1的情况下,(10+AKTION_FEHLER_DATENBANK)
可以进行编译时评估,但在解决方案2的情况下则不能。
但是更重要的情况是它们不能互换使用,例如:
case AKTION_FEHLER_DATEBANK:
在案例1中是合法的,但在案例2中则不合法。
同样适用于char Array[AKTION_FEHLER_DATEBANK]
。