C 全局变量的值在我的代码中是如何变化的?
我在主函数之后再次声明了全局变量,但它仍然影响主函数。我知道C允许在第一次声明没有初始化变量时再次声明全局变量(它在C++中不起作用)。如果我在main函数之后赋值,它仍然在C中使用两个警告,但是在C++中给出错误。p> 我已经调试了代码,但它从来没有达到C 全局变量的值在我的代码中是如何变化的?,c,global-variables,C,Global Variables,我在主函数之后再次声明了全局变量,但它仍然影响主函数。我知道C允许在第一次声明没有初始化变量时再次声明全局变量(它在C++中不起作用)。如果我在main函数之后赋值,它仍然在C中使用两个警告,但是在C++中给出错误。p> 我已经调试了代码,但它从来没有达到inta=10的行 #include <stdio.h> #include <string.h> int a; int main() { printf("%d",a); return 0; } /*a
inta=10的行代码>
#include <stdio.h>
#include <string.h>
int a;
int main()
{
printf("%d",a);
return 0;
}
/*a=10 works fine with following warnings in c.
warning: data definition has no type or storage class
warning: type defaults to 'int' in declaration of 'a' [-Wimplicit-int]|
but c++ gives the following error
error: 'a' does not name a type|
*/
int a=10;
#包括
#包括
INTA;
int main()
{
printf(“%d”,a);
返回0;
}
/*a=10可以正常工作,c中有以下警告。
警告:数据定义没有类型或存储类
警告:在“a”[-Wimplicit int]的声明中,类型默认为“int”|
但是C++给出了以下错误
错误:“a”未命名类型|
*/
INTA=10;
这里的输出是10
int a; /* global declaration */
编译器将上述语句视为声明而不是定义。它在其他翻译单元中查找a
的定义,在下面的main()
中找到
int a=10;
因此,输出10
为避免警告,请使用extern
声明a
,例如
extern int a;
有几件事:
- 第一个
inta代码>是一个暂定声明;第二个inta=10代码>是一个定义声明
a
是在文件范围内声明的,因此它将具有static
存储持续时间-这意味着在程序启动时(在main
执行之前)将为其留出存储空间并进行初始化,即使定义声明稍后在源代码中出现
- 旧版本的C允许隐式
int
声明-如果变量或函数调用没有声明,则假定其类型为int
。C++不支持隐式声明,因此将得到错误。
我知道,今天的C++编译器不能运行代码:
int a;
int main()
{
printf("%d",a);
return 0;
}
int a=10;
也不是
因为C++检测变量的双声明。
和
因为它无法在方法外部初始化变量
错误:“a”不命名类型“是因为第二个错误,C++希望第一个单词是声明的类型(EX:int,Load,char,---等),并且给出变量。 < P>从C标准中,第62.2P2
2具有文件作用域的对象的标识符声明(不带初始值设定项、不带存储类说明符或带存储类说明符static)构成了一个暂定定义
那么这个
int a;
是标识符a
的暂定定义
关于暂定定义的两点:
- 如果同一翻译单元中没有定义,则暂定定义将充当初始值设定项
=0
的实际定义李>
- 如果在同一翻译单元中更早或更晚找到实际的外部定义,则暂定定义仅充当声明李>
在您的程序中,编译器在同一翻译单元中找到了a
的定义:
int a=10;
因此,当使用C编译器编译时,您将获得输出10
现在,关于C++编译器编译时的错误:
如果您的程序中有此语句:
a=10;
int a=10;
<>这将在编译C++编译器时出错,因为您缺少所需的类型说明符。但这段代码将使用C编译器编译,因为在旧版本的C(C89/90)中,如果缺少类型说明符,那么它将默认设置为int
。当然,使用C99&C11编译器编译时会收到警告消息,因为不再支持此隐式声明
如果您的程序中有此语句:
a=10;
int a=10;
C++没有暂定定义和inta的概念代码>是C++中的定义。所以,由于C++编译器的概念会给出错误-代码>重新定义‘A’< /COD>。因为C++是一种与C++不同的语言,尽管它有很多相似之处。用<代码>外部> /代码>声明C++允许。