在头文件中的静态成员函数内声明了多少个静态数据实例?

Gre*_*ill 1 c++ static

我正在使用在AIX 上编译CppcheckxlC.每个检查器类都派生自一个Check类,其构造函数负责在全局静态列表中注册该类型的检查器.

这是相关代码的相关部分(文件名链接到Github上的完整源代码):

check.h

class Check {
public:
    Check() {
        instances().push_back(this);
        instances().sort();
    }
    static std::list<Check *> &instances() {
        static std::list<Check *> _instances;
        return _instances;
    }
    // ...
};
Run Code Online (Sandbox Code Playgroud)

checkbufferoverrun.h

class CheckBufferOverrun: public Check {
    // ...
};
Run Code Online (Sandbox Code Playgroud)

checkbufferoverrun.cpp

// Register this check class (by creating a static instance of it)
namespace
{
CheckBufferOverrun instance;
}
Run Code Online (Sandbox Code Playgroud)

注意_instances静态变量是如何static文件中的函数内声明的(没有相应的check.cpp文件).编译时g++,编译器和链接器协同工作以确保只有一个静态instances()函数的实现,因此只有静态_instances列表的一个实例.在不同.cpp文件中实例化的所有不同检查器类_instances一起注册在同一列表中.

但是,在AIX下xlC,这个相同的代码最终会为包含它的每个文件创建一个不同的 instances()函数,每个.cpp文件都有不同的静态_instances列表.因此,不再存在单个中央_instances列表,这会导致Cppcheck无法运行大部分检查.

在这种情况下哪个编译器的行为是正确的?

更新:这个问题不是关于如何解决问题,我已经做到了.我很好奇哪种行为是正确的.

Jam*_*lis 9

g ++具有正确的行为:应该只有一个对象的实例.C++标准说(C++ 03 7.1.2/4):

外部内联函数中的静态局部变量始终引用同一个对象.

因为类有外部链接,静态成员函数也有外部链接,每个C++ 03 3.5/5:

成员函数...如果类的名称具有外部链接,则具有外部链接.

因为成员函数是在类定义中定义的,所以它是一个内联函数,根据C++ 03 7.1.2/3:

类定义中定义的函数是内联函数.