gpt4 book ai didi

c++ - 构建时的静态变量解析

转载 作者:行者123 更新时间:2023-11-28 03:42:18 24 4
gpt4 key购买 nike

我有链接在一起的文件:

基础.h

#pragma once

extern const string APPLICATION_NAME;

应用程序.cpp

#include "basic.h"

const string APPLICATION_NAME = "MyApplication";

............

错误表.h

class ErrorTable
{
public:
ErrorTable();

private:
map <index, errorRecord> _errorTable;


};

错误表.cpp

#include "basic.h"

ErrorTable TheErrorTable;

ErrorTable::ErrorTable()
{
...
_errorTable[errorIndex] = errorRecord(APPLICATION_NAME + " hit some error.");
...
}

此代码可以在 Visual Studio 中构建和运行。当我使用 GCC 时,它可以构建但在运行时失败。问题出在具有静态链接的 TheErrorTable 中,并且是在 main() 启动之前创建;它无法解析 APPLICATION_NAME 变量。如果我使用局部变量隐藏它,一切正常。

是否有 GCcflags在构建时强制解析静态变量或以其他方式实现 Visual Studio 的行为?

最佳答案

The problem is in TheErrorTable that has static linkage and is created before main() is started; it can't resolve APPLICATION_NAME variable.

没错。 要么 TheErrorTable 要么 APPLICATION_NAME 首先被初始化,你无法解决这个问题。


使 ErrorTable 不是 成为全局的。您无法定义跨 TU 的静态初始化顺序,即使可以,您也只会让代码更难遵循。

我不想这么说,但是 ErrorTable 可能会受益于这里的单例模式(因为 function-static 有合理的初始化顺序),至少在它是最接近您现有代码的解决方案。


更新

正如@godexsoft 提到的,您可以通过利用常量初始化 并将APPLICATION_NAME 设为char const* 而不是一个 std::string;然后你的初始化器将是一个常量表达式初始化器,没有构造函数调用,因此将在任何 ErrorTable 之前被调用——跨 TUs——保证。 ( Really? Yes. )

关于c++ - 构建时的静态变量解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8749841/

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