单例类可以在全局函数里面调用吗?

问题遇到的现象和发生背景

在单例类头文件dbg_log_handler.h里面声明静态变量 m_dbg_Instance,在对应cpp dbg_log_handler.cpp里面定义这个静态变量 m_dbg_Instance.当我在全局函数调用这个单例类时,我发现每调用一次就构造一次.当我把这个静态变量的定义放在这个全局函数所在的cpp dbg_common.cpp里面时,则只构造一次,没有想明白为何会是这样子.

问题相关代码,请勿粘贴截图

dbg_log_handler.h

class DbgLogHandler final{

static DbgLogHandler& Instance() {
return m_dbg_Instance;
}

static DbgLogHandler m_dbg_Instance;

};

dbg_log_handler.cpp
DbgLogHandler DbgLogHandler ::m_dbg_Instance;
DbgLogHandler::DbgLogHandler()
: {

}

dbg_common.cpp
/m_dbg_Instance定义在这就构造一次,放在dbg_log_handler.cpp里面每调用一次info_log的接口就会构造一次这个单例,很奇怪/
int info_log(const char* format) {
DbgLogHandler& dbg = DbgLogHandler::Instance();
}

不知道你是否有将构造函数、copy操作都设为private?
只看你这一段代码并不能看出问题,如果可以,建议发出工程demo + 运行环境。我用的Win10x64 + VS 2022 就没问题,不会多次初始化单例模式。
我比较怀疑是代码其他部分发生了构造、或者拷贝构造。

或者你在你的PC上运行以下我改写的下面这段代码,将实例化延迟到第一次调用instance时,而不是程序启动时(进入main前)。
看看调用info_log()还会不会导致单例模式多次初始化:

// dbg_log_handler.h
#pragma once
#include <iostream>
using namespace std;

class DbgLogHandler final {
public:
    static DbgLogHandler& Instance() {
        static DbgLogHandler m_dbg_Instance;
        return m_dbg_Instance;
    }

private:
    DbgLogHandler()
    { // definition for Debug
        cout << "construct DbgLogHandler" << endl;
    }

    DbgLogHandler(const DbgLogHandler&) = default;
    DbgLogHandler& operator=(const DbgLogHandler&) = default;
    ~DbgLogHandler() = default;
};


// dbg_common.h
#pragma once

int info_log(const char* format);

// dbg_common.cpp
#include "dbg_log_handler.h"

#include <iostream>
using namespace std;

int info_log(const char* format) {
    cout << "info_log" << endl;
    DbgLogHandler& dbg = DbgLogHandler::Instance();
    return 0;
}

// test.cpp
#include "dbg_log_handler.h"
#include "dbg_common.h"

#include <iostream>
using namespace std;

int main()
{
    cout << "enter main" << endl;
    //DbgLogHandler obj1 = DbgLogHandler::Instance();
    //DbgLogHandler obj2 = DbgLogHandler::Instance();

    info_log("A");
    info_log("B");
    return 0;
}

可以的

代码写的不太规范,构造函数未声明就实现,后面描述也没说清什么时候单例什么时候多次构造。

好像是可以的。

完全可以,头文件所有定义都是全局的