在c中,在我看来,在函数之外写的所有内容都已经是'extern'。 那么,什么时候你必须将变量指定为extern?
是否与定义与声明有关?
另外,为了访问另一个文件中定义的变量,是否需要使用extern变量?
答案 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
变量,你暗示你的编译器那些是在功能块之外定义的,或者可能在不同的源中,就像我们在这里做的那样。这些定义将在链接器时间找到。
外部变量必须在任何函数之外定义一次