c++基础2

"本文详细介绍了C++中include头文件的使用,包括尖括号与双引号的区别,以及编译器查找头文件的路径。同时,对比了C++结构体与C结构体在成员函数、访问控制、继承和初始化等方面的差异。最后,讲解了在C++中导入C函数的关键字extern"C"的用法以及C++程序从源码到可执行文件的四个步骤:预编译、编译、汇编和链接。"
摘要由CSDN通过智能技术生成

1.1.4 说说include头文件的顺序以及双引号""和尖括号<>的区别

参考回答

  1. 区别:

    (1)尖括号<>的头文件是系统文件,双引号""的头文件是自定义文件

    (2)编译器预处理阶段查找头文件的路径不一样。

  2. 查找路径:

    (1)使用尖括号<>的头文件的查找路径:编译器设置的头文件路径-->系统变量。

    (2)使用双引号""的头文件的查找路径:当前头文件目录-->编译器设置的头文件路径-->系统变量。

1.1.5 说说C++结构体和C结构体的区别

参考回答

区别:

(1)C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。

(2)C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。

(3)C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。

(4)C 中使用结构体需要加上 struct 关键字,或者对结构体使用 typedef 取别名,而 C++ 中可以省略 struct 关键字直接使用。

答案解析

  1. C++ 中的 struct 是对 C 中的 struct 进行了扩充,它们在声明时的区别如下:

    CC++
    成员函数不能有可以
    静态成员不能有可以
    访问控制默认public,不能修改public/private/protected
    继承关系不可以继承可从类或者其他结构体继承
    初始化不能直接初始化数据成员可以
  2. 使用时的区别:C 中使用结构体需要加上 struct 关键字,或者对结构体使用 typedef 取别名,而 C++ 中可以省略 struct 关键字直接使用,例如:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    struct Student{

        int  iAgeNum;

        string strName;

    }

    typedef struct Student Student2;    //C中取别名

    struct Student stu1;    // C 中正常使用

    Student2 stu2;            // C 中通过取别名的使用

    Student stu3;            // C++ 中使用

1.1.6 导入C函数的关键字是什么,C++编译时和C有什么不同?

参考回答

  1. 关键字:在C++中,导入C函数的关键字是extern,表达形式为extern “C”, extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。

  2. 编译区别:由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名

答案解析

1

2

3

4

5

6

7

8

9

10

//extern示例

//在C++程序里边声明该函数,会指示编译器这部分代码按C语言的进行编译

extern "C" int strcmp(const char *s1, const char *s2);

//在C++程序里边声明该函数

extern "C"{

    #include <string.h>//string.h里边包含了要调用的C函数的声明

}

//两种不同的语言,有着不同的编译规则,比如一个函数fun,可能C语言编译的时候为_fun,而C++则是__fun__

1.1.7 简述C++从代码到可执行二进制文件的过程

参考回答

​ C++和C语言类似,一个C++程序从源码到执行文件,有四个过程,预编译、编译、汇编、链接

答案解析

  1. 预编译:这个过程主要的处理操作如下:

    (1) 将所有的#define删除,并且展开所有的宏定义

    (2) 处理所有的条件预编译指令,如#if、#ifdef

    (3) 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。

    (4) 过滤所有的注释

    (5) 添加行号和文件名标识。

  2. 编译:这个过程主要的处理操作如下:

    (1) 词法分析:将源代码的字符序列分割成一系列的记号。

    (2) 语法分析:对记号进行语法分析,产生语法树。

    (3) 语义分析:判断表达式是否有意义。

    (4) 代码优化:

    (5) 目标代码生成:生成汇编代码。

    (6) 目标代码优化:

  3. 汇编:这个过程主要是将汇编代码转变成机器可以执行的指令。

  4. 链接:将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。

    链接分为静态链接和动态链接。

    静态链接,是在链接的时候就已经把要调用的函数或者过程链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。

    而动态链接,是在链接的时候没有把调用的函数代码链接进去,而是在执行的过程中,再去找要链接的函数,生成的可执行文件中没有函数代码,只包含函数的重定位信息,所以当你删除动态库时,可执行程序就不能运行。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值