定义和声明有什么区别?

两者的意义都不见了。


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

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
}

...或者是一个typedefusing语句。

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?

下一篇: What is the effect of extern "C" in C++?