在程序中
case0.c
int main()
{
int x;
x = 4;
}
X首先声明为int,并在下面的行中为x分配内存。这里没问题。
但是,如果我编写这些文件(作为更大程序的一部分)
case1.c
extern int x;
x = 4;
我得到,gcc,warning: data definition has no type or storage class
。同样的,如果我做了
case2.c
extern int x = 4;
gcc也不喜欢它,给了warning: 'x' initialized and declared 'extern'
唯一不抛出任何警告的情况是
case3.c
extern int x;
int x = 4;
为什么案例1给出一个错误,而案例0没有?案例3是我定义外部变量的唯一方法吗?
发布于 2022-04-13 18:34:40
首先将
x声明为int,并在下面的行为x分配内存。这里没问题。
不,不是这样的。在一个函数中,int x;
定义了x
,它为它保留内存。然后x = 4;
在该内存中存储一个值。
extern int x;
x = 4;
extern int x;
声明有一个x
,但没有定义它。如果程序使用这个x
,它应该在其他地方定义它。
在函数之外,只应出现声明。但是,x = 4;
是一种语句,因此它在函数之外是不合适的。
extern int x = 4;
这是有效的C,但它是非常规用法,所以编译器警告您。通常,我们编写int x = 4;
来定义和初始化x
,编写extern int x;
来声明x
而不定义它。
extern int x = 4;
是由标准定义的;在这个上下文中,它实际上与int x = 4;
相同。但是程序员通常不使用这种形式。
(如果x
之前有一个可见的声明,如static int x;
,那么extern int x = 4;
与int x = 4;
确实不同。extern int x = 4;
将引用先前声明的x
,而int x = 4;
将尝试创建新的x
。)
extern int x;
int x = 4;
extern int x;
声明了x
,但没有定义它。
int x = 4;
定义并初始化x
。
是第3种情况下定义外部变量的唯一方法吗?
如果您只需要在一个翻译单元中使用x
,则可以单独使用int x = 4;
,而不需要extern int x;
。如果需要在多个翻译单元中使用x
,则应该将extern int x;
放在头文件中,并将该头文件包含在每个使用x
的源文件中,包括定义该文件的源文件中。
发布于 2022-04-13 19:13:10
“
”是我定义外部变量的唯一方法吗?
不,如果项目中的其他源文件是可见的和可用的,则不是这样。如果只在创建它的文件中使用它,就没有理由给它extern
持续时间。
需要具有extern
持续时间的变量的场景是,它存储的值需要由多个源文件引用。
创建extern
变量以支持该场景的一种常见方法(地点):
extern
修饰符声明变量。.h
,也可以是.c
。如果在声明文件以外的文件中定义,则文件必须是声明文件。.c
)在任何源文件中使用extern
变量。
示例:
文件
//anywhere in header file
extern int g_number;//declare extern variable.
//Note extern keywork required only during declaration
//Not during definition
//prototypes
void output_extern_variable( void );
void update_extern_variable( void );
...
文件c
//in file global space
#include "file.h"
int g_number = 25;//define extern variable
int main(void)
{
output_extern_variable();
update_extern_variable();
output_extern_variable();
...
文件2.c
#include "file.h"
...
void output_extern_variable(void)
{
printf("Value of g_number is: %d\n", g_number);
}
void update_extern_variable( int *var )
(
g_number += 1;
)
https://stackoverflow.com/questions/71861961
复制相似问题