如何在头文件中保留常量定义而不将其链接到每个库中?

问题描述 投票:0回答:1

这是场景。我们使用 Visual C++ 9。有一个 C++ 库可供许多其他库使用。它的接口位于标题中:

#pragma once

//CommonLibraryHeader.h
CSomeClass GetSomeClassFunction(); //is defined in some .cpp file
const CSomeClass MagicValue( 100, 200 ); //some predefined value that the previous function retuns to signify something important

现在该库已内置到 .dll 文件中。头文件发布在公共位置并包含在其他几个库中。这些库内置于其 .dll 文件中。

最终结果如下。由于每个 .dll 都是一个单独的可执行模块,因此它必须保留所有这些常量。每个“常量”实际上都是具有重要构造函数和析构函数的类的实例。现在每个 .dll 都有一个

MagicValue
的副本,并且用于构造和销毁变量的代码被注入到每个 .dll 文件中,如果许多常量发生同样的情况,这会增加加载时间并显着增加 .dll 文件。

可能的解决方案是标记常量

extern
并将定义移至 .cpp 文件中。但是,传递到构造函数中的常量值对于头文件的人类读者来说并不能立即可见。人们可以在那里添加关于值是什么的注释,但像往常一样,现在我们必须使注释与实际代码保持同步。

是否有更好的解决方案 - 无需从标头中移动常量,也不会将构造/销毁代码注入到每个 .dll 文件中?

c++ visual-c++ linker
1个回答
2
投票

您可以使用导出类和函数的 DLL 中经常使用的技巧:使用仅在构建要包含代码的 DLL 时定义的 #define,但在其他 DLL 中未定义,然后执行

 #if
根据需要调用构造函数或将其定义为 extern。

© www.soinside.com 2019 - 2024. All rights reserved.