这是我的情况:
main.cpp
#include <Windows.h>
#include <functional>
std::function<void()> OnPrepare;
int WINAPI WinMain(HINSTANCE inst, HINSTANCE preInst, TCHAR*, int) {
if (OnPrepare) {
OnPrepare();
}
return 0;
}
other.cpp
#define _AFXDLL
#include <afx.h> // TRACE
#include <functional>
extern std::function<void()> OnPrepare;
class Init {
public:
Init() {
OnPrepare = []() {
TRACE("hello, world!\n");
};
}
};
Init g_init;
此代码在Win32应用程序中不起作用,但在控制台应用程序中则很好。我不知道为什么谁能指出我的代码出了什么问题?如果我不能这样做,还有更好的方法吗?
编辑:
OnPrepare
在Win32应用程序中始终为null,因此不会出现"hello, world"
。 最佳答案
用于构造g_init
的代码修改了OnPrepare
。当然,只有在已经构建OnPrepare
的情况下,这才是合法的。但是,如果在g_init
之前构造OnPrepare
怎么办?然后,您将修改尚未构造的对象,然后再构造已经修改的对象。哎哟。在静态对象的构造函数中进行实际工作从来都不是一个好主意。
目前尚不清楚您的外部问题是什么,但是此代码不是解决此问题的好方法。一个丑陋的解决方法是将全局std::function
替换为返回对静态std::function
函数的引用的全局函数并使用它。这样可以确保在分配对象之前构造对象。
std::function<void()>& getOnPrepare()
{
static std::function<void()> OnPrepare;
return OnPrepare;
}
然后
Init
的构造函数可以调用getOnPrepare
,确保在将OnPrepare
分配给以下对象之前对其进行构造:Init() {
getOnPrepare() = []() {
TRACE("hello, world!\n");
};
关于c++ - std::function分配在Visual C++ 2015 Win32应用程序中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53652464/