zoukankan      html  css  js  c++  java
  • 程序编译的四个阶段

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

    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成员  
    

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

    总结

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

  • 相关阅读:
    Linux PXE无人值守网络装机
    Linux 自动化部署DNS服务器
    Linux DNS服务配置
    Mysql数据库基础学习笔记
    Linux AIDE(文件完整性检测)
    mysql:[Err] 1068
    sql的date、时间函数、时间戳
    hive之建立分区表和分区
    excel转sql代码
    spark-submit之使用pyspark
  • 原文地址:https://www.cnblogs.com/hustcpp/p/12375903.html
Copyright © 2011-2022 走看看