我在main函数之后再次声明了全局变量,但是它仍然会影响main函数。我知道C允许在第一次声明未初始化全局变量时再次声明全局变量(在c ++中不起作用)。如果我在main函数之后分配值,则它在c中仍然会出现两个警告,但在c ++中会给出错误。
我已经调试了代码,但从未到达int a=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;
输出为10
。
答案 0 :(得分:6)
几件事:
第一个int a;
是临时声明;第二个int a = 10;
是定义声明。
a
是在文件范围内声明的,因此它将具有static
的存储期限-这意味着将在程序启动时(在{{1}之前)为其存储保留并进行初始化。 }执行),即使定义声明稍后在源代码中出现。
较旧的C版本允许隐式main
声明-如果出现变量或函数调用而没有声明,则假定其类型为int
。 C ++不支持隐式声明,因此会出现错误。
答案 1 :(得分:3)
这里
int a; /* global declaration */
编译器将上述声明视为声明 未定义。它在其他翻译单元中查找a
的定义,在main()
下方找到
int a=10;
因此输出10
。
为避免警告,请使用a
存储类声明extern
,例如
extern int a;
答案 2 :(得分:2)
根据C Standard#6.9.2p2
2声明对象的标识符,该对象的文件范围没有初始化程序,没有存储类说明符或具有存储类说明符静态,则构成临时定义 ... ..
所以,这个
int a;
是标识符a
的临时定义。
关于临时定义的点对:
= 0
一起充当实际定义。 在您的程序中,编译器在同一翻译单元中找到了a
的定义:
int a=10;
因此,使用C编译器进行编译时,您将获得输出10
。
现在,关于使用C ++编译器进行编译时的错误:
如果您的程序中包含以下语句:
a=10;
这将在使用C ++编译器进行编译时产生错误,因为您缺少必需的类型说明符。但是此代码将使用C编译器进行编译,因为在旧版本的C(C89 / 90)中,如果缺少类型说明符,则它将默认设置为int
。当然,使用C99和C11编译器进行编译时会收到警告消息,因为不再支持此隐式声明。
如果您的程序中包含以下语句:
int a=10;
C ++没有临时定义的概念,int a;
是C ++中的定义。因此,由于One Definition Rule的概念,C ++编译器将给出错误-redefinition of 'a'
。
答案 3 :(得分:0)
我所知,当今的c ++编译器无法运行代码:
import 'package:collection/collection.dart';
class Bank {
Function equals = const MapEquality().equals;
Map<Map<String, String>, double> _exchangeRates = Map();
void addExchangeRate(String from, String to, double i) {
_exchangeRates[{from: to}] = i;
}
double getExchangeRate(String from, String to) {
return _exchangeRates[_exchangeRates.keys.firstWhere((entry){
return equals(entry, {from : to});
})];
}
}
void main() {
Bank bank = Bank();
bank.addExchangeRate('USD', 'CHF', 2);
bank.addExchangeRate('INR', 'USD', 1 / 60);
bank.addExchangeRate('INR', 'NRS', 160 / 100);
print(bank.getExchangeRate('USD', 'CHF'));
print(bank.getExchangeRate('INR', 'USD'));
print(bank.getExchangeRate('INR', 'NRS'));
}
也
int a;
int main()
{
printf("%d",a);
return 0;
}
int a=10;
因为c ++检测到变量的双重声明。
和
因为它无法在方法外部初始化变量。
错误“'a'不命名类型”是因为(第二个)错误,c ++期望第一个单词是声明的类型(例如:int,long,char,-etc-),并且给出了变量。