这是我的情况:

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/

10-10 07:11