外部变量的目的?

时间:2014-07-11 04:19:37

标签: c global-variables terminology extern

在c中,在我看来,在函数之外写的所有内容都已经是'extern'。 那么,什么时候你必须将变量指定为extern?

是否与定义与声明有关?

另外,为了访问另一个文件中定义的变量,是否需要使用extern变量?

2 个答案:

答案 0 :(得分:4)

extern将可见性扩展到整个程序,通过外部变量我们可以在程序中的任何地方使用变量,只要我们知道它们的声明并且变量在某处定义。

默认情况下,文件范围的变量声明(不在其他文件中)外部

  

在c中,在我看来,所有写在函数之外的东西都是   已经'外部'。那么,什么时候,你必须指定一个   变量为外部?

这很可能适用于c functions 默认情况下,C函数的声明和定义前缀为“extern”

例如,有一个名为file1.c的文件,并声明了函数lilke

int my_function();

开头有extern隐藏,编译器将其视为如下。

extern int my_function();

因此,每当我们定义一个C函数时,函数定义的开头就会出现一个extern。

对于C变量

在定义函数时,我们可以在extern之前添加它而不会出现任何问题。但 C变量并非如此。

如果我们在变量中存在extern作为默认值,那么它们的内存将不会被分配,它们将仅被声明。因此,当我们想要声明它们而不定义它们时,我们将extern显式地放入C变量。 `

答案 1 :(得分:1)

以下是使用extern变量的方法。

我有一个UART.c:

#include<stdio.h>  
#include<string.h>
#include<UART.h>

int UART_Rcv(unsigned char* Rx_Str[], unsigned int len);

int status;

int UART_Rcv(unsigned char* Rx_Str[], unsigned int len)
{
    //Some code for implementation of UART receive.

    //set status value and return it, May be (SUCCESS or FAILURE?)
    return status;
}

现在我有一个UART.h

 //header guard
 #ifndef __UART_H
 #define __UART_H

 //Some UART related macros

 extern int status;
 extern int UART_Rcv(unsigned char* Rx_Str[], unsigned int len);

 //other externs if any

 #endif

现在我有一个main.c,它将使用在UART.c中声明的函数和变量

#include<stdio.h>  
#include<string.h>
#include<UART.h>

#define WIMP_OUT_N_GO_HOME     (0)

int main(void)
{
    unsigned char Received_String[30];

    //Some code and may be initialization of UART?

    //Flush the Received_String before using it
    UART_Rcv(Received_String, 10);

    //Some code

    return WIMP_OUT_N_GO_HOME;
}

当定义变量时,编译器为该变量分配内存,并可能还将其内容初始化为某个值。声明变量时,编译器要求在其他地方定义变量。所以通过extern你的UART_Rcv()函数和status变量,你暗示你的编译器那些是在功能块之外定义的,或者可能在不同的源中,就像我们在这里做的那样。这些定义将在链接器时间找到。

外部变量必须在任何函数之外定义一次