首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确定义外部变量?

如何正确定义外部变量?
EN

Stack Overflow用户
提问于 2022-04-13 17:58:55
回答 2查看 74关注 0票数 1

在程序中

case0.c

代码语言:javascript
运行
复制
int main()
{
    int x;
    x = 4;
}

X首先声明为int,并在下面的行中为x分配内存。这里没问题。

但是,如果我编写这些文件(作为更大程序的一部分)

case1.c

代码语言:javascript
运行
复制
extern int x; 
x = 4; 

我得到,gcc,warning: data definition has no type or storage class。同样的,如果我做了

case2.c

代码语言:javascript
运行
复制
extern int x = 4;

gcc也不喜欢它,给了warning: 'x' initialized and declared 'extern'

唯一不抛出任何警告的情况是

case3.c

代码语言:javascript
运行
复制
extern int x;
int x = 4;

为什么案例1给出一个错误,而案例0没有?案例3是我定义外部变量的唯一方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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的源文件中,包括定义该文件的源文件中。

票数 1
EN

Stack Overflow用户

发布于 2022-04-13 19:13:10

”是我定义外部变量的唯一方法吗?

不,如果项目中的其他源文件是可见的和可用的,则不是这样。如果只在创建它的文件中使用它,就没有理由给它extern持续时间。

需要具有extern持续时间的变量的场景是,它存储的值需要由多个源文件引用。

创建extern变量以支持该场景的一种常见方法(地点):

  • 在头文件中使用extern修饰符声明变量。
  • 定义项目文件中具有声明可见性的extern变量。(例如,可以是.h,也可以是.c。如果在声明文件以外的文件中定义,则文件必须是声明文件。.c
  • 通过#(包括声明文件

)在任何源文件中使用extern变量。

示例:

文件

代码语言:javascript
运行
复制
//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

代码语言:javascript
运行
复制
//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

代码语言:javascript
运行
复制
#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;
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71861961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档