c++中,声明(Declaration)与定义(Definition)有什么不同?

在 C++ 中,声明(Declaration)定义(Definition) 的区别,本质上可以归结为一句话:

声明:告诉编译器"这个名字存在";
定义:为这个名字"分配实体并(通常)提供实现"。

但在实际编程中,这一差异涉及链接(linkage)、存储分配、编译单元组织等多个关键机制,下面系统展开。


一、核心区别(语义层)

维度 声明(Declaration) 定义(Definition)
作用 引入符号 创建实体
是否分配内存 ❌ 不分配 ✅ 分配(变量/对象)
是否提供实现 ❌ 不提供 ✅ 提供(函数/类)
是否可重复 ✅ 可多次声明 ❌ 通常只能定义一次(ODR)

二、变量:最直观的区别

1. 声明(不分配内存)

cpp 复制代码
extern int x;

含义:

  • 告诉编译器:x 存在

  • 不分配内存

  • 常用于跨文件引用


2. 定义(分配内存)

cpp 复制代码
int x = 10;

含义:

  • 创建变量 x

  • 分配存储空间

  • 可选初始化


👉 一个程序中必须满足:

每个变量只能有一个定义,但可以有多个声明


三、函数:声明 vs 定义

1. 函数声明(函数原型)

cpp 复制代码
int add(int a, int b);

作用:

  • 告诉编译器函数签名

  • 用于提前使用(尤其头文件)


2. 函数定义(实现)

cpp 复制代码
int add(int a, int b) {
    return a + b;
}

作用:

  • 提供函数体

  • 生成实际代码


👉 注意:

函数声明可以多次出现,但定义只能有一次(否则违反 ODR)。


四、类:一个"特殊情况"

cpp 复制代码
class A {
public:
    void f();
};

这是:

定义(definition)

❗ 同时也是声明

原因:

  • 类定义本身并不分配对象内存

  • 但它完整描述了类型结构

👉 所以类的规则是:

  • 类本身只能定义一次

  • 成员函数可以单独定义

五、总结

声明(Declaration):

  • 引入名字

  • 不分配资源

  • 可重复

定义(Definition):

  • 创建实体

  • 分配内存或提供实现

  • 只能出现一次(ODR约束)


六、从编译器视角再看一句话总结

  • 声明:进入符号表(symbol table)

  • 定义:进入符号表 + 生成实体(内存/代码)


相关推荐
智者知已应修善业2 小时前
【C++非递归剪枝问题凑钱方案数】2024-7-18
c语言·c++·经验分享·笔记·算法·剪枝
Yolo_TvT2 小时前
C++:缺省参数
开发语言·c++·算法
承渊政道2 小时前
【优选算法】(实战领略前缀和的真谛)
开发语言·数据结构·c++·笔记·学习·算法
xiaoliuliu123452 小时前
Dev C++ 5.11开发编辑器 安装教程:详细步骤+自定义安装路径(附简体中文设置)
开发语言·c++
lcj25112 小时前
蓝桥杯C++:算法1:高精度
c++·算法·蓝桥杯
liulilittle2 小时前
SQLite3 C++ usage demo
数据库·c++·sqlite
leaves falling3 小时前
C++类和对象(3)(初始化列表,类型转换,static成员,友元)
java·开发语言·c++
宵时待雨3 小时前
C++笔记归纳15:封装map & set
开发语言·数据结构·c++·笔记·算法
福楠3 小时前
现代C++ | 右值引用 + std::move + noexcept
linux·c语言·开发语言·c++