C++基础:多文件编程

本文为《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 文件需要调用另一个 .c 文件里的变量或者函数,而不能从 .h 文件中调用变量

例1
在 a.h 文件中定义一个变量,在 b.c 文件中引用,会报错,未定义这个变量
C++基础:多文件编程
例2
在 a.c 文件中定义一个变量,在 b.c 文件中引用,成功调用
C++基础:多文件编程

在声明语句中不要给变量赋值

  • 在声明语句中不要给变量赋值,否则声明语句就变成了定义语句
  • 而且在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误
    • 例如,extern int a = 5int a = 5 意义是一样的,都是定义

例1
在 a.h 文件中使用 extern int a = 5 定义一个变量,在 b.c 文件中引用,会报 warning,但程序可以运行
C++基础:多文件编程

引用函数

  • 如果需要调用其他 .c 文件中的函数,在文件中的函数声明前加 extern 即可
  • 因为声明全局函数默认前面带有 extern,不加 extern 而直接声明函数也可以

例1
a.c 中定义一个 fun 函数,b.c 中要引用这个函数,b.c 中的声明 extern int fun();int fun(); 没有任何区别,如下两个图
C++基础:多文件编程
C++基础:多文件编程

如果不想让其他 .c 文件引用本文件中的变量,加上 static 即可

C++基础:多文件编程

上一篇:程序如何得到特定符号的所在物理地址


下一篇:C语言笔记 03_常量&存储类