c++中,声明(Declaration)与定义(Definition)有什么不同?
在 C 中声明Declaration与定义Definition的区别本质上可以归结为一句话声明告诉编译器“这个名字存在”定义为这个名字“分配实体并通常提供实现”。但在实际编程中这一差异涉及链接linkage、存储分配、编译单元组织等多个关键机制下面系统展开。一、核心区别语义层维度声明Declaration定义Definition作用引入符号创建实体是否分配内存❌ 不分配✅ 分配变量/对象是否提供实现❌ 不提供✅ 提供函数/类是否可重复✅ 可多次声明❌ 通常只能定义一次ODR二、变量最直观的区别1. 声明不分配内存externintx;含义告诉编译器x存在不分配内存常用于跨文件引用2. 定义分配内存intx10;含义创建变量x分配存储空间可选初始化 一个程序中必须满足每个变量只能有一个定义但可以有多个声明三、函数声明 vs 定义1. 函数声明函数原型intadd(inta,intb);作用告诉编译器函数签名用于提前使用尤其头文件2. 函数定义实现intadd(inta,intb){returnab;}作用提供函数体生成实际代码 注意函数声明可以多次出现但定义只能有一次否则违反 ODR。四、类一个“特殊情况”classA{public:voidf();};这是✅定义definition❗ 同时也是声明原因类定义本身并不分配对象内存但它完整描述了类型结构 所以类的规则是类本身只能定义一次成员函数可以单独定义五、总结声明Declaration引入名字不分配资源可重复定义Definition创建实体分配内存或提供实现只能出现一次ODR约束六、从编译器视角再看一句话总结声明进入符号表symbol table定义进入符号表 生成实体内存/代码