小编典典

定义和声明有什么区别?

all

两者的含义都让我无法理解。


阅读 204

收藏
2022-02-28

共1个答案

小编典典

声明 引入了一个标识符并描述了它的类型,无论是类型、对象还是函数。声明是 编译器需要 接受对该标识符的引用。这些是声明:

extern int bar;
extern int g(int, int);
double f(int, double); // extern can be omitted for function declarations
class foo; // no extern allowed for type declarations

定义 实际上 实例化/实现了这个标识符。这 是链接器 将引用链接到这些实体所需要的。这些是与上述声明相对应的定义:

int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
class foo {};

可以使用定义代替声明。

可以根据需要随时 声明 标识符。因此,以下在 C 和 C++ 中是合法的:

double f(int, double);
double f(int, double);
extern double f(int, double); // the same as the two above
extern double f(int, double);

但是,它必须只 定义
一次。如果您忘记定义已在某处声明和引用的内容,那么链接器将不知道将引用链接到什么并抱怨缺少符号。如果你定义了不止一次,那么链接器不知道链接引用到 哪个
定义并且抱怨重复的符号。


由于关于什么是 C 中的类 声明 与类 定义 的争论不断出现(在对其他问题的回答和评论中),我将在此处粘贴 C 标准的引用。
在 3.1/2,C++03 说:

一个声明就是一个定义,除非它 […] 是一个类名声明 […]。

3.1/3 再举几个例子。其中:

[例子: [...]
结构 S { int a; 诠释 b; }; // 定义 S、S::a 和 S::b [...]
结构 S; // 声明 S
——第二个例子

总结一下:C 标准认为 struct x;一个 声明struct x {};定义。(换句话说, “前向声明”用词不当
,因为在 C
中没有其他形式的类声明。) __ __

感谢litb (Johannes Schaub)在他的一个答案中挖掘出实际的章节和诗句。

2022-02-28