gpt4 book ai didi

c - 定义和声明有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 04:21:21 24 4
gpt4 key购买 nike

两者的含义让我难以理解。

最佳答案

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

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 说:

A declaration is a definition unless it [...] is a class name declaration [...].

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 - 定义和声明有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46546058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com