【问题标题】:Can an inline variable be changed after initialization in C++17?在 C++17 中初始化后可以更改内联变量吗?
【发布时间】:2020-03-30 09:53:18
【问题描述】:

我的场景如下(它在 clang 中有效,但在 gcc 中无效)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

void myFunc() {
    //
    MYGLOBAL = 28;
}

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

问题是内联变量在我预期为 28 的地方显示为 0,因为它已经在运行时进行了修改。 MSVC 不同意这一点,但 clang 做了我所期望的事情。

问题是:可以在我的场景中在运行时修改内联变量吗?(我通过取消内联变量解决了这个问题。)

【问题讨论】:

    标签: c++ visual-c++ dll clang c++17


    【解决方案1】:

    是的,inline变量可以在初始化后修改。

    但是,DLL 在带有 MSVC 的 Windows 上是很奇怪的东西。近似地,每个 DLL 都被建模为自己的 C++ 程序,具有完全独立的运行时。因此,主程序有一个 inline 变量的副本,另一个用于 DLL。

    【讨论】:

    • 类似的caveat emptor:将同一个静态库链接到两个 DLL(然后您将其与同一个程序链接)将生成所有静态库变量的两个副本。跨度>
    • 这意味着,我猜,我必须使用非内联变量。它是否正确?至少在我想共享在运行时更改的值的多个 dll 的情况下......
    • 是的,您需要使用非inline 变量。您还需要确保它们是从一个 DLL 导出并从那里导入到所有其他地方。
    猜你喜欢
    • 2017-04-24
    • 1970-01-01
    • 2022-09-17
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多