gpt4 book ai didi

c++ - 跨多个源文件构建 C++ 静态数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:02 45 4
gpt4 key购买 nike

我有一个看起来像这样的系统:

Master.h

extern const Activators[2];

Master.cpp

#include <TypeOne.h>
#include <TypeTwo.h>
const Activators[2] = { &TypeOne::Create, &TypeTwo::Create };

您可以想象 TypeOne 和 TypeTwo 是具有返回新实例的静态 Create 方法的类。

我正在寻找一种方法来分解这个系统,这样就不需要一个文件来创建对所有类型的链接时依赖性。

我希望能够将仅包含 TypeOne 目标文件的单元测试与仅填充了指向 TypeOne 的 Create 方法的函数指针的静态 Activators 数组版本链接在一起。

在 C++ 中有没有一种方法可以创建一个静态定义的数组,然后跨编译单元填充该数组中的各个槽?理想情况下,我能够拥有这样的东西:

Master.cpp

const Activators[2];

TypeOne.cpp

Activators[0] = &TypeOne::Create;

TypeTwo.cpp

Activators[1] = &TypeTwo::Create;

最佳答案

C++ 初始化全局变量的方式真的很奇怪,从技术上讲,到目前为止的其他答案都有未定义的行为,尽管无论如何可能会在您的机器/编译器上工作。基本上,问题是当程序启动时,只需要实现初始化 main.cpp 中的全局变量和它的头文件。当您的代码调用在另一个 cpp/header 组合(翻译单元)中定义的函数时,只有在那时 才需要 C++ 来初始化那个翻译单元中的全局变量

您的特定情况中最简单(安全)的解决方法是简单地在 header 中进行初始化。如果文件有 include "TypeOne.h",它将初始化 Activators[0] 本身。为了便于移植,包含 int main() 的翻译单元(cpp 文件)还包含您需要使用的所有这些文件的 header 非常重要。否则,您无法严格保证它们会在 main 开始之前被初始化。

在TypeOne.h中

#include "master.h"

class TypeOne {
static std::unique_ptr<TypeOne> Create();
//stuff
};
static const auto TypeOneInitialized = Activators[0] = &TypeOne::Create;

如果您有一个不应该依赖 TypeTwo 的 cpp,只需不包含它的 header 即可。

关于c++ - 跨多个源文件构建 C++ 静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24942463/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com