外部变量的作用



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

它是否与定义和声明有关?

另外,为了访问已经在另一个文件中定义的变量,是否声明一个带有extern的变量是必要的?

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

在文件范围内(不在其他文件中)的变量声明默认为外部

在c中,在我看来,所有写在函数之外的东西都是已经"外来的"。那么,具体什么时候需要指定a变量作为外部变量?

对于c functions,这很可能是正确的默认情况下,C函数的声明和定义都有" extern "前缀

例如,有一个名为file1.c的文件和声明函数,如
int my_function();

开头有一个extern,它是隐藏的,编译器将其视为如下。

extern int my_function();

因此,无论何时定义一个C函数,在函数定义的开头都有一个extern。

对于C变量

在定义函数时,可以在其前面加上extern而不会出现任何问题。但是对于C变量就不是这样了。

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

以下是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变量,您暗示编译器它们是在函数块之外定义的,或者可能在不同的源中,就像我们在这里所做的那样。这些定义将在链接时找到。

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

相关内容

  • 没有找到相关文章

最新更新