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