两者的含义都让我无法理解。
声明 引入了一个标识符并描述了它的类型,无论是类型、对象还是函数。声明是 编译器需要 接受对该标识符的引用。这些是声明:
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 中没有其他形式的类声明。) __ __
struct x;
struct x {};
感谢litb (Johannes Schaub)在他的一个答案中挖掘出实际的章节和诗句。