C++ 中 声明(declaration)和定义(definition)是两个不同的概念,理解它们的区别对于编写正确的代码至关重要。理解声明和定义的区别对于避免链接错误和违反 ODR 至关重要。正确地组织声明和定义是编写大型 C++ 项目的基础。

1、声明(Declaration)

声明是告诉编译器某个变量或函数的存在和类型,但不分配内存或给出具体实现。声明通常发生在头文件中,它告诉编译器在其他地方会有对应的定义。声明并不创建实际的对象或函数,它只是对对象或函数的描述。

1)变量声明

#include <iostream>

extern int x;  // 声明,表示x是一个int类型的变量,定义在其他地方

int main() {
    std::cout << "x的值是: " << x << std::endl;  // 使用声明的变量x
    return 0;
}

// 在其他地方的定义:
int x = 10;  // 定义变量x并初始化

2)函数声明

#include <iostream>

int add(int a, int b);  // 声明,表示有一个函数add,接受两个int参数,返回int类型

int main() {
    int result = add(3, 5);  // 使用声明的函数
    std::cout << "3 + 5 = " << result << std::endl;
    return 0;
}

// 在其他地方的定义:
int add(int a, int b) {  // 定义并实现函数add
    return a + b;
}

2、定义(Definition)

定义则是实际创建变量、对象或实现函数体的地方。定义不仅告诉编译器某个变量或函数的类型,还分配内存或者实现其功能。每个变量或函数在程序中只能有一个定义。

1)变量定义

#include <iostream>

int x;  // 定义,声明并分配内存

int main() {
    x = 10;  // 给变量赋值
    std::cout << "x 的值是: " << x << std::endl;  // 输出 x 的值
    return 0;
}

2)函数定义

#include <iostream>

int add(int a, int b) {  // 定义,给出函数的实现
    return a + b;  // 返回 a 和 b 的和
}

int main() {
    int result = add(5, 3);  // 调用 add 函数
    std::cout << "5 + 3 = " << result << std::endl;  // 输出结果
    return 0;
}

3、声明与定义的区别

声明只是告诉编译器变量或函数的存在和类型,而定义才是实际分配内存并给出具体实现。一个变量或函数只能有一个定义,但可以有多个声明。声明通常放在头文件中,定义一般放在源文件中。

// 声明
extern int x;  // 声明变量
extern void print();  // 声明函数

// 定义
int x = 10;  // 定义并初始化变量
void print() {  // 定义函数并实现
    std::cout << "Hello, World!" << std::endl;
}