只是想确保我理解外部变量是什么

时间:2012-03-14 22:02:06

标签: c variables external

对于我们的任务,我们必须用C编写程序,但它表示不在程序中使用外部变量。这是否意味着其他文件中的变量带入主代码,或者如果它们不在同一个函数中,我无法在同一个文件中使用变量? (即:我可以将一个值作为参数传递给函数,并让它返回一个值,该值可能与该函数中的变量有关,并将返回值设置为某个值,或者是使用外部变量吗?)

我已经用Google搜索了,但目前还不清楚,我想确定一下,因为这一点非常重要。

3 个答案:

答案 0 :(得分:2)

为了确保,我将所有变量都作为函数的一部分,并将它们作为参数传递或从函数中返回。

外部变量至少有两种解释。

首先,我们有extern关键字,它基本上象征着你所谓的全局变量。它是在多个翻译单元中声明的变量,但它只存在于内存中的一个位置。它在单个文件中初始化,所有后续更改都会影响变量的使用范围:

//globals.cpp
int x = 1337;

//main.cpp
extern int x;

int main()
{
   //x is 1337 here
   return 0;
}

第二个含义可以是在类范围内声明和定义的变量,但不能用作extern。但是,您可以将其视为方法的外部。

//main.cpp
int x = 1337; //is this external?
              //could be, remove it just to be safe

int main()
{
   return 0;
}

答案 1 :(得分:1)

让我们考虑所有可能的情况,因为从你的问题我也不太确定:

extern作为关键字。为了理解这一点,您需要了解编译单元。基本上,每个文件都是一个编译单元 - 因此每个.c都会编译为.o,并在其中替换标头。在每个编译单元中,您转发声明您希望使用的符号 - 例如属于其他编译单元的函数。

现在,如果在一个.c文件中声明一个全局变量,那么它就是该文件的全局变量,但在任何其他文件中根本不作为符号存在 - 编译器会报错,因为它不会知道声明变量的位置。

(当然,如果你在一个标题中声明变量 - 它将存在于包含标题的所有对象中,然后链接器会生气,因为当它链接所有对象上的一些符号将具有相同的名称。)

为了解决这个问题,可以使用extern int x;来定义变量。这告诉编译器a)int x应该对这个编译单元可用,b)int x不是 in 这个编译单元和c)链接器应该检查它是否存在于某个地方你组成一个图书馆或程序的所有单位。

从概念上讲,您一直在使用函数的前向声明来执行此操作。没有办法转发声明变量。事实上,你可以do this with functions too而不是打扰共享标题,虽然这不是一个好主意。


另一种情况是“外部变量”是指某个范围或模块外部的东西。我会仔细检查你的作业,如果有疑问,请问 - 无论是谁设置它都应该能够向你解释它们的确切含义。

答案 2 :(得分:1)

外部变量是具有外部链接的变量。

具有外部链接的变量是在没有static关键字的文件范围内定义的变量。

int bla = 0;           // external variable
static int blop =  1;  // non-external variable

int main(void)
{
    return bla
}

请注意,使用extern关键字声明的变量不一定具有外部链接。与const一样,C中并不代表常数,extern并不代表外部。

人们经常使用外部词来表示变量实际上是在当前翻译单元中声明的,但是在另一个翻译单元中定义。