I ve been trying to figure out some boundaries of g++
, especially linking (C++) object files. I found the following curiosity which I tried to compress as much as possible before asking.
Code
文件common.h
#ifndef _COMMON_H
#define _COMMON_H
#include <iostream>
#define TMPL_Y(name,T)
struct Y {
T y;
void f() {
std::cout << name << "::f " << y << std::endl;
}
virtual void vf() {
std::cout << name << "::vf " << y << std::endl;
}
Y() {
std::cout << name << " ctor" << std::endl;
}
~Y() {
std::cout << name << " dtor" << std::endl;
}
}
#define TMPL_Z(Z)
struct Z {
Y* y;
Z();
void g();
}
#define TMPL_Z_impl(name,Z)
Z::Z() {
y = new Y();
y->y = name;
std::cout << #Z << "(); sizeof(Y) = " << sizeof(Y) << std::endl;
}
void Z::g() {
y->f();
y->vf();
}
#endif
文件<代码>a.cpp 编辑:<代码>g++ - Wall -c a.cpp
#include "common.h"
TMPL_Y( a ,char);
TMPL_Z(Za);
TMPL_Z_impl( a ,Za);
文件<编码>b.cpp 编辑:<代码>g++ - 安装——c b.cpp
#include "common.h"
TMPL_Y( b ,unsigned long long);
TMPL_Z(Zb);
TMPL_Z_impl( b ,Zb);
文件<代码>main.cpp汇编并与<代码>g++链接 a.o b.o main.cpp
#include "common.h"
struct Y;
TMPL_Z(Za);
TMPL_Z(Zb);
int main() {
Za za;
Zb zb;
za.g();
zb.g();
za.y = zb.y;
return 0;
}
<代码>/a.out的结果
a ctor
Za(); sizeof(Y) = 8
a ctor // <- mayhem
Zb(); sizeof(Y) = 12
a::f a
a::vf a
a::f b // <- mayhem
a::vf b // <- mayhem
Question
现在,我本希望<代码>g++>,把试图将<代码>a.o和b.o
联接起来的一些新名字叫我。 特别是,<代码>za.y = zb.y的转让是邪恶的。 不仅如此,<条码>g++/代码>根本不抱怨,我希望它把不符合同名称的类型(<条码>Y)联系起来,而且完全忽视了<条码>b.o(resp.b.cpp
)中的次要定义。
我指的是我不做些事情:sooo>/em>。 两个汇编单位在一个大型项目中可以使用同一名称。
这难道是一种ug吗? 是否有任何人对这一问题有所了解?