当前位置: 代码迷 >> 综合 >> 《C/C++学习指南》语法篇—笔记 (十六、多文件项目及编译过程)
  详细解决方案

《C/C++学习指南》语法篇—笔记 (十六、多文件项目及编译过程)

热度:48   发布时间:2024-02-07 02:33:33.0

《C/C++学习指南》语法篇—笔记 (十六、多文件项目及编译过程)

        • extern
        • 项目生成过程 build
        • 头文件及include
        • 预处理指令--define宏定义
        • ★★★main函数的参数与返回值

extern

extern:声明外部函数。
在A.cpp中使用B.cpp中的函数,需要extern声明。
extern:声明外部全局变量
在A.cpp中访问B.cpp中的全局变量,需要extern声明

作用:告诉编译器,在某个cpp文件中,存在那么一个函数/全局变量。
符号(symbol):把函数名和全局变量名称为符号。

全局变量的声明与定义全局变量声明语句是不能加初始值的):

//声明
extern int a;
extern double b;
extern float number[5];
//定义
int a = 10;
double b;
float numbers[5] = {1.0,1.1};

函数的声明与定义(函数的声明语句中,关键字extern可以省略)

//函数声明
extern int sum(int,int);
//函数定义
int sum(int a, int b)
{return a+b;
}

注意问题:

  • 重定义 :多个cpp中,不能定义形态名字的符号(不能定义相同名称的全局变量;不能定义相同的函数:C++里相同函数指函数名和参数列表均相同)
  • 无定义:使用extern声明了一个函数并调用了它,但是在链接过程中,没有一个cpp里发现它的定义。

项目生成过程 build

步骤一:编译 compile
将所有的cpp转成obj文件(obj:目标文件)
A.cpp -> A.obj
B.cpp -> B.obj

注:编译的逐个cpp文件进行的,没有区分顺序,先后都一样,只要声明了一个函数 extern,就可以调用它,编译器不检查是否真的存在这个符号

步骤二:链接 link
将各个obj文件综合在一起,生成可执行程序
A.obj , B.obj , … -> Test.exe

注:链接阶段检查所有符号是否重名;检查所有外部符号是否有定义。

头文件及include

头文件 (Head File)

  • 通常后缀名为 .h
  • 内容一般分为几种:类型定义(定义个结构体等)、函数声明extern void test();(extern可省略)、变量声明extern int number;

包含头文件 :#include "xxx.h"

#include原理:编译器在处理每个cpp之前,首先进行一个预处理:将所有的#include行替换成头文件的具体内容,形成一个中间文件,然后再对这个中间文件进行编译。编译之前的预处理过程,称为“预编译”过程

预处理指令–define宏定义

#开头的行,都为预处理指令,用于指示编译器做一些预处理工作。预处理指令不是语句,行尾不需要加分号。
#define指令:宏定义

  • 定义一个“数值” #define PI 3.14
  • 定义一个“算式” #define Max(a,b) a>b ? a : b

注:#define本身用处不大,容易出错。需要明确:==预处理过程是把#define的文本直接替换的,不会有任何计算动作。#define代入的是文本,而不是值。==只要把文本原本不动代入后,检查语法是否正确,程序是否复合逻辑。

define取代方法:
1、定义变量或const常量

const double PI = 3.14;

2、定义inline函数

inline int max(int a, int b)
{return a>b?a:b;
}

★★★main函数的参数与返回值

  • 必须存在一个main函数,该函数可以在任意一个cpp里定义。
  • main函数是程序的入口,即第一个被执行的函数,不能有两个main函数
  • main函数有3种形式
int main()
int main(int argc)
int main(int argc, char* argv[])  / int main(int argc, char** argv)
  • argc 表示命令行参数的个数
    参数个数 >= 1
  • argv 表示命令行参数的值
    argv[0] 就是程序本身的名字,后面空格间隔开输入其余参数,每个参数都是字符串类型的。所以要好好理解这个char* argv[]char** argv
    程序里将字符串转成数字 int a = atoi(argv[1]); double a = atof(argv[1]);

在命令行方式下运行程序,各个参数以空格分开,当参数本身含有空格时,需要用双引号括起来。

main函数返回值int型
一般来说,当程序返回0表示该任务完成,非0表示遇到错误或异常情况。

system()函数可以模拟命令行方式调用,在ANSI 标准函数里查找