《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 标准函数里查找