本文为《C++ Primer》的读书笔记
目录
多文件编程
函数
- 当我们调用一个函数时,编译器只需要掌握函数的声明
- 因此,我们将函数声明放在头文件中,而定义放在源文件中
inline
以及constexpr
函数的定义通常放在头文件中
类
- 当我们使用一个类类型的对象时,类定义必须是可用的,但成员函数的定义不必已经出现
- 因此,我们将类定义放在头文件中,而类的成员函数的定义放在源文件中
模板
- 为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义
- 因此,模板的头文件通常既包括声明也包括定义。函数模板和类模板成员函数的定义通常放在头文件中
外部变量声明 extern
本节大部分内容转自:C语言extern关键字用法和理解 (写的很清楚)
extern
表明变量或者函数是定义在其他其他文件中的
- 例如
extern int a;
显式地说明了a
的存储空间是在程序的其他地方分配的。因此编译器会在文件中其他位置或者其他文件中寻找变量a
建议最优用法
- 例如
a.c
文件中定义int a = 5
和一个函数,在a.h
里写extern int a;
,如果要在其他文件里调用a
这个变量和函数,直接#include<a.h>
即可
一个 .c 文件需要调用另一个 .c 文件里的变量或者函数,而不能从 .h 文件中调用变量
例1
在 a.h 文件中定义一个变量,在 b.c 文件中引用,会报错,未定义这个变量
例2
在 a.c 文件中定义一个变量,在 b.c 文件中引用,成功调用
在声明语句中不要给变量赋值
- 在声明语句中不要给变量赋值,否则声明语句就变成了定义语句
- 而且在函数体内部,如果试图初始化一个由
extern
关键字标记的变量,将引发错误- 例如,
extern int a = 5
与int a = 5
意义是一样的,都是定义
- 例如,
例1
在 a.h 文件中使用 extern int a = 5
定义一个变量,在 b.c 文件中引用,会报 warning,但程序可以运行
引用函数
- 如果需要调用其他 .c 文件中的函数,在文件中的函数声明前加
extern
即可 - 因为声明全局函数默认前面带有
extern
,不加extern
而直接声明函数也可以
例1
a.c 中定义一个 fun
函数,b.c
中要引用这个函数,b.c
中的声明 extern int fun();
与 int fun();
没有任何区别,如下两个图
如果不想让其他 .c 文件引用本文件中的变量,加上 static
即可
- C++ 中建议使用未命名的命名空间来代替
static