定义和声明有什么区别?
两者的意义都不见了。
一个声明引入一个标识符并描述它的类型,无论它是一个类型,对象还是函数。 声明是编译器需要接受对该标识符的引用。 这些是声明:
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然后举几个例子。 其中:
[Example: [...] struct S { int a; int b; }; // defines S, S::a, and S::b [...] struct S; // declares S —end example
总结一下:C ++标准认为struct x;
是一个声明和struct x {};
一个定义。 (换句话说, “前向声明”是一个误称 ,因为在C ++中没有其他形式的类声明。)
感谢litb(Johannes Schaub)在他的一个答案中挖掘了实际的章节和诗句。
从C ++标准部分3.1:
声明将名称引入翻译单位或重新声明先前声明引入的名称。 声明指定了这些名称的解释和属性。
下一段指出(强调我的)宣言是一个定义,除非......
...它声明了一个没有指定函数正文的函数
void sqrt(double); // declares sqrt
...它在类定义中声明了一个静态成员
struct X
{
int a; // defines a
static int b; // declares b
};
...它声明了一个类名
class Y;
...它包含没有初始化器或函数体的extern
关键字
extern const int i = 0; // defines i
extern int j; // declares j
extern "C"
{
void foo(); // declares foo
}
...或者是一个typedef
或using
语句。
typedef long LONG_32; // declares LONG_32
using namespace std; // declares std
现在,理解声明和定义之间的区别很重要的重要原因是: 一个定义规则 。 从C ++标准的3.2.1节开始:
任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义。
声明:“某处存在一个foo。”
定义:“...在这里!”
链接地址: http://www.djcxy.com/p/1057.html上一篇: What is the difference between a definition and a declaration?