我正在使用在AIX 上编译CppcheckxlC
.每个检查器类都派生自一个Check
类,其构造函数负责在全局静态列表中注册该类型的检查器.
这是相关代码的相关部分(文件名链接到Github上的完整源代码):
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)
class CheckBufferOverrun: public Check {
// ...
};
Run Code Online (Sandbox Code Playgroud)
// 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无法运行大部分检查.
在这种情况下哪个编译器的行为是正确的?
更新:这个问题不是关于如何解决问题,我已经做到了.我很好奇哪种行为是正确的.
g ++具有正确的行为:应该只有一个对象的实例.C++标准说(C++ 03 7.1.2/4):
外部内联函数中的静态局部变量始终引用同一个对象.
因为类有外部链接,静态成员函数也有外部链接,每个C++ 03 3.5/5:
成员函数...如果类的名称具有外部链接,则具有外部链接.
因为成员函数是在类定义中定义的,所以它是一个内联函数,根据C++ 03 7.1.2/3:
类定义中定义的函数是内联函数.
归档时间: |
|
查看次数: |
535 次 |
最近记录: |