【发布时间】:2014-04-25 14:49:23
【问题描述】:
以不同方式定义相同类 A 的两个库(这是 legacy-crap-code)
A 的原型:
在库 A 中:
#include <string>
struct A
{
static void func( const std::string& value);
};
在库 B 中:
#include <string>
struct A
{
void func( const std::string& value);
};
main.cpp 使用来自 lib A(组件 A)的 A:s 标头
#include "liba.h"
int main()
{
A::func( "some stuff");
return 0;
}
main 与 lib A 和 lib B 链接。
如果 lib B 在 lib A 之前“链接”(在链接指令中),我们会得到一个核心,因此,lib B:s 定义是纠察队。
这不是我预期的行为。我认为符号之间会有一些差异,因此加载器/运行时链接器可以选择正确的符号。也就是说,非静态成员函数的隐藏 this 指针以某种方式包含在符号中。
这真的是符合规范的行为吗?
两者的行为相同:
g++ (GCC) 4.4.7 20120313(红帽 4.4.7-4)
带有 g++ 4.8.1 的 RHEL 开发工具
【问题讨论】:
-
像你一样,我本来希望成员函数的静态性以某种方式编码在损坏的名称中,只是为了避免此类错误。但在 GCC 中,显然不是。
-
“这真的是符合标准的行为吗?” 你的程序违反了单一定义规则,所以它不是一个有效的 C++ 程序,所以是的,它 100% 符合你的程序以意想不到的方式打破。