第6.2章: 声明与定义

English

概述

在 C++ 中,每个函数在使用之前必须先被声明。 函数也可以单独定义。理解声明与定义之间的区别, 对于把代码组织到多个文件中至关重要;即使在小型程序里, 它也有助于理清编译器是如何阅读你的代码的。

在本章中,你将学到:

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. 小结