答案 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}}。