Linker 为什么g++;链接器是否允许更改接口?
考虑以下几点: 我有两个类(A,B),它们都使用单个头文件(H)。 我将B预编译成一个对象文件,然后将A编译成一个二进制文件,该二进制文件调用B中的函数 现在,我在头文件中做了一个更改,并重新编译a。这将产生垃圾输出。 我的问题是,为什么编译器首先允许这种情况发生 具体例子如下: h类Linker 为什么g++;链接器是否允许更改接口?,linker,g++,Linker,G++,考虑以下几点: 我有两个类(A,B),它们都使用单个头文件(H)。 我将B预编译成一个对象文件,然后将A编译成一个二进制文件,该二进制文件调用B中的函数 现在,我在头文件中做了一个更改,并重新编译a。这将产生垃圾输出。 我的问题是,为什么编译器首先允许这种情况发生 具体例子如下: h类 #include <string> using namespace std; class cat_bus; class catStr { private: string *a; pu
#include <string>
using namespace std;
class cat_bus;
class catStr {
private:
string *a;
public:
catStr(string *a)
{
this->a = a;
}
string chars()
{
return a->c_str();
}
};
class cat {
friend class cat_bus;
private:
catStr a;
//catStr z; //version X +1
catStr b;
catStr c;
catStr d;
public :
cat()
:a(new string("str1")),
//z(new string("strz")), //version X +1
b(new string("str2")),
c(new string("str3")),
d(new string("str4"))
{
}
};
class cat_bus
{
private:
cat myCat;
public:
string getA()
{
return myCat.a.chars();
}
string getB()
{
return myCat.b.chars();
}
string getC()
{
return myCat.c.chars();
}
};
void userLibA();
void userLibB();
void userLibC();
main.cpp
#include <iostream>
#include "cat.h"
using namespace std;
void userLibA()
{
cat_bus catbus;
cout <<"\nA:"<< catbus.getA() << "\n";
}
void userLibB()
{
cat_bus catbus;
cout << "B:"<< catbus.getB()<<"\n";
}
void userLibC()
{
cat_bus catbus;
cout << "C:" <<catbus.getC()<<"\n";
}
#include <iostream>
#include "user.h"
#include "cat.h"
using namespace std;
int main ()
{
userLibA();
userLibB();
userLibC();
cat_bus catbus;
}
编译主:
g++ main.cpp user.o
主要运行模式:
./a.out
产生:
A:str1
B:str2
C:str3
A:str1
B:strz <<<< This line is garbage
C:str3
现在取消对cat.h中的注释的注释。重新编译main并运行它。现在生产:
A:str1
B:strz <<<< This line is garbage
C:str3
A:str1
strz您需要构造make文件,以便.cpp文件依赖于相应的.h。如果.h发生更改,这将强制make重新编译.cpp。无论链接器或编译器可能给你什么“额外保护”-你必须首先确保你的构建是正确的。在这种情况下,预编译文件将被分发,我们只希望人们能够访问头文件,而不是源文件,所以不能真的使用此选项你能使头文件只读吗?有趣的方法,但不幸的是,我们不能在这种情况下。