程序编译的四个阶段

四个阶段分别是: 预处理,编译,组装,链接

  1. 预处理将头文件展开,将宏定义替换,生成符号文件.S
  2. 编译则包含了词法检查,语法检查,权限检查, 代码优化
  3. 组装:将编译后的代码组装成机器码, 形成位置无关的目标文件 .o
  4. 链接将多个位置无关的目标文件合并成可执行文件

可见组装才是平台相关的,之前的操作都与平台无关, 换句话说是编译前端和编译后端

具体有个例子

一个类的成员变量修改了访问控制符,在另外一个文件被引用,是否必须编译修改的文件才能链接成功?
答案是不需要
例如我们有 abc.hpp abc.cpp 定义了一个class

class a {
public: 
    int a = 0;
};

在main.cpp 中有引用

int main(){
  a a;
  std::cout << a.a;
}

这样是可以编译成功

# 生成main.o abc.o
g++ -c main.cpp abc.cpp
# 链接 
g++ -o main main.o abc.o
# 成功 

然后修改public为private 重新编译abc

g++ -c abc.cpp
# 重新链接  
g++ -o main main.o abc.o

#成功!且可以执行  

但是重新编译main.cpp

g++ -c main.cpp 

#失败,提示无法访问private成员  

可见,访问权限是在编译期检查的, 编译成目标文件后,就不会去检查了

总结

编译成目标文件或者库文件后, 不会再去检查权限位了, 运行时照样可以访问

posted @ 2020-02-28 10:03  SnailRush  阅读(2197)  评论(0编辑  收藏  举报