繁体   English   中英

C中的声明和定义混乱

[英]Declaration and definition confusion in C

这个答案使我感到困惑。

如果我们在同一.c文件中有两行:

extern int c;
int c;
  • 代码的第一行如何声明,第二行如何定义?
  • 都不都是声明吗?
  • 这两行有何不同?

extern关键字使第一行成为声明。 它说“此变量存在于某处”。 这样的行会出现在头文件中。

第二行是定义,因为不存在extern关键字。 如果要在头文件中包含此行,则包含该头的两个源文件都将定义该变量,并且链接这两个文件将导致变量重新定义错误。

定义为变量创建空间:

int c;

无论您将这条线放在哪里,无论是局部的,全局的,这都表示将出现一个int类型的新变量c

extern int c;

声明说在其他地方还有一些int类型的变量c 通过使用extern ,您说c定义在其他地方。 如果仅在其他地方放置没有定义的extern声明,则将出现链接错误。 使用extern等效于函数的前向声明:

/* declaration */
int f(int x);

/* definition */
int f(int x) {
  return x*x;
}

第一种意味着在某处有一个函数f返回一个int并接受一个int作为参数。 后者是实际的函数,其代码也可用作声明和定义。

海事组织,这种对标定义的命名方式令人困惑。 我几乎不记得哪个是什么,而且我通常需要考虑一下。 但是,您应该了解extern含义以及什么是前向声明。

当您正在编写的程序由链接在一起的多个源文件组成时,需要在其他源文件中引用例如在源文件file1.c中定义的某些变量,因此这就是使用extern的原因。

关于您的问题,这些行有何不同:

extern int c;
int c;
  • 当编译器为变量分配存储空间时定义了一个变量

  • 当编译器被告知存在一个变量(这就是它的类型)时,就声明一个变量。 此时,它不会为变量分配存储空间。

所以只有int c; extern int c;定义extern int c; 被宣告。

长话短说, 定义事物意味着提供所有必要的信息以完整地创建事物。 但是, 声明某些内容意味着仅提供足够的信息让计算机知道它的存在

编辑:更清楚:一个定义既定义又声明,一个声明声明。 当按定义使用extern关键字时,您未定义任何内容。 您的困惑来自 extern 的理解

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM