C中的声明和定义混淆

时间:2016-10-05 12:42:29

标签: c external public extern

answer使我感到困惑。

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

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

4 个答案:

答案 0 :(得分:2)

当您编写的程序包含链接在一起的多个源文件时,其中一些定义的变量(例如,在源文件file1.c中)需要在其他源文件中引用,因此这就是为什么使用外部量。

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

rbindlist(l1, idcol = 'g')
  • 当编译器为其分配存储空间时定义变量

  • 时变量
  • 当编译器被通知变量时,声明变量 存在(这是它的类型);它没有为其分配存储空间 那时的变量。

因此在声明extern int c; int c; 时只定义了int c;

答案 1 :(得分:1)

extern关键字是第一行成为声明的原因。它说“这个变量存在于某个地方”。像这样的一行可以出现在头文件中。

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

答案 2 :(得分:1)

定义为变量创建空间:

int c;

无论你将这一行放在本地,全局,这都说明c类型的新变量int将会生效。

extern int c;

声明表示其他地方还有c类型的变量int。通过使用extern,您可以说c已在其他位置定义。如果只放置extern声明而没有其他地方的定义,则会出现链接错误。使用extern相当于函数的前向声明:

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

VS

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

第一个意味着某个函数f返回int并接受int作为参数。后者是实际的函数,它的代码,它既可以作为声明也可以作为定义。

IMO,这种声明与定义命名令人困惑。我几乎不记得哪一个是什么,我通常需要考虑它。但是,您应该理解extern的含义以及前瞻性声明是什么。

答案 3 :(得分:0)

长话短说,定义意味着提供所有必要的信息来完整地创建该事物。但是,声明意味着只为计算机提供足够的信息知道它存在

编辑:更清楚:定义既定义又声明,声明声明。根据定义使用extern关键字时,您没有定义任何内容。您的困惑源于extern的{​​{3}}。