第6.2章: 声明与定义
概述
在 C++ 中,每个函数在使用之前必须先被声明。 函数也可以单独定义。理解声明与定义之间的区别, 对于把代码组织到多个文件中至关重要;即使在小型程序里, 它也有助于理清编译器是如何阅读你的代码的。
在本章中,你将学到:
- 什么是函数声明
- 什么是函数定义
- 为什么需要声明
- 声明如何让函数在定义之前就能被调用
- 为什么声明通常放在头文件中
- 为什么
int x();是函数声明,而不是变量
1. 函数定义
定义提供函数的完整函数体。
int add(int a, int b)
{
return a + b;
}
这既声明了该函数,也定义了该函数。
2. 函数声明
声明告诉编译器某个函数存在, 但不提供函数体。
int add(int a, int b); // declaration
声明以分号结尾,没有函数体。
之后,再定义该函数:
int add(int a, int b) // definition
{
return a + b;
}
3. 为什么需要声明
编译器自上而下地读你的程序。 如果你在编译器看到某个函数之前就调用它,你必须先提供 一个声明。
#include <fast_io.h>
int add(int a, int b); // declaration
int main()
{
using namespace ::fast_io::iomnp;
println(add(3, 4)); // OK
}
int add(int a, int b) // definition
{
return a + b;
}
没有该声明,main 内的调用就会报错。
4. 声明通常放在头文件中
在真实项目中,声明被放在头文件(.h 或 .hpp)中,
而定义放在源文件(.cpp)中。
math.hpp:
-----------
int add(int a, int b);
math.cpp:
-----------
int add(int a, int b)
{
return a + b;
}
这让多个源文件通过包含该头文件来使用同一个函数。
4.1 一个常见错误:int x(); 是函数声明
在 C++ 中,int x(); 这种语法不会
创建变量。它声明了一个名为 x 的函数,
该函数不接受参数并返回 int。
int main()
{
int x(); // ❌ NOT a variable — this declares a function
::fast_io::string str(); // ❌ also a function declaration
}
这条规则适用于任何类型,包括用户定义类型和
::fast_io::string。
定义变量的正确方式
对于内建类型:
int x{}; // ✔ value-initialized variable
对于 ::fast_io::string:
::fast_io::string str; // ✔ default-constructed string
在现代 C++ 中,内建类型优先使用 {} 初始化,以避免
与函数声明混淆。
5. 小结
- 声明引入函数的名字、参数与返回类型。
- 定义提供函数体。
- 定义同时也算作声明。
- 调用函数之前需要有声明。
- 声明通常放在头文件里;定义放在源文件里。
int x();声明的是函数,不是变量。- 内建变量初始化请使用
{}。 - 创建字符串变量请使用
::fast_io::string str;。