【发布时间】:2016-06-08 11:42:29
【问题描述】:
// SomeOtherClass.hpp
#pragma once
int someOtherCallMe();
class SomeOtherClass {
public:
static int callMe() {
static int _instance = 7;
++_instance;
return _instance;
}
};
// SomeOtherClass.cpp
#include "SomeOtherClass.hpp"
int
someOtherCallMe() {
return SomeOtherClass::callMe();
}
// main.cpp
#include "SomeOtherClass.hpp"
#include <iostream>
int
main() {
std::cout << SomeOtherClass::callMe();
std::cout << someOtherCallMe();
return 0;
}
我有三个文件:SomeOtherClass.hpp/cpp、main.cpp。这些文件生成两个二进制文件:共享库(SomeOtherClass.cpp)和可执行文件(main.cpp,与共享库链接)。
C++ 是否保证static <any-type> _instance 在程序执行期间是单个变量(不管它定义了多少个二进制文件)?
注意
澄清情况。我在这种情况下看到的困惑是,一方面,SomeOtherClass::callMe 在程序中定义了两次,这是意料之中的(因为类静态成员函数实际上是具有内部链接的常规函数,如果它们被定义到位,比如在这种情况下),这就是你可以从反汇编中看到的。因为我们在机器代码中有两个带有静态局部变量的函数。语言/标准如何限定他们的行为?
【问题讨论】:
-
使用 MS Visual Studio 时,您需要使用正确的
__declspec来构建 DLL 并使用 DLL 使其工作。 -
是的,我知道谢谢。
-
如果问题真的是关于跨 DLL 边界的静态变量,那么应该在标题中提到,并且在正文中更突出