Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
extern short i有什么问题;i=2?gcc抱怨类型冲突_C_C99_Definition_Extern - Fatal编程技术网

extern short i有什么问题;i=2?gcc抱怨类型冲突

extern short i有什么问题;i=2?gcc抱怨类型冲突,c,c99,definition,extern,C,C99,Definition,Extern,以下代码与两次被否决的问题类似,因此我面临风险;-) 它不使用MinGW和-std=c99编译——为什么?第一行是标识符i的声明,而不是对象的定义。但是,标识符具有文件范围,因此默认情况下具有外部链接。它可以在其他地方声明和定义。第二行可以是对该对象的赋值。但是gcc抱怨缺少类型或存储类,并且在猜测类型为int之后,抱怨类型冲突 你说短i具有文件作用域,这对我来说意味着它(edit:和随后的i=2;)在函数之外。在函数外部,i=2本身完全是胡说八道;作为语句,它不能出现在函数外部。(编辑)由于语

以下代码与两次被否决的问题类似,因此我面临风险;-)


它不使用MinGW和-std=c99编译——为什么?第一行是标识符i的声明,而不是对象的定义。但是,标识符具有文件范围,因此默认情况下具有外部链接。它可以在其他地方声明和定义。第二行可以是对该对象的赋值。但是gcc抱怨缺少类型或存储类,并且在猜测类型为int之后,抱怨类型冲突

你说
短i
具有文件作用域,这对我来说意味着它(edit:和随后的
i=2;
)在函数之外。在函数外部,
i=2本身完全是胡说八道;作为语句,它不能出现在函数外部。(编辑)由于语句不能出现在函数之外,“赋值”必须是一个定义。在旧的C代码中,没有存储类的定义是
int
定义,因此您的代码等价于(在这些规则下,它看起来像是GCC正在应用的)以下内容:

对于C编译器来说,这当然是毫无意义的。(结束编辑)

通过定义和初始化以下内容,可以或多或少地获得所需的效果:

short i = 2;
如果您仅仅希望声明一个外部变量,那么这是不起作用的;在这种情况下,将初始化放在带有定义的文件中,或放在一个函数中(如下所示)


我不确定任务是否可以在职能之外执行。这可能是根本原因。代码是在函数内部还是外部?(语句不能出现在函数之外;声明和定义可以。)@michaelb958:我敢肯定——它们不能。感谢“…完全是胡说八道”。因此gcc没有其他解释方法。此外,代码中不需要“extern”,因为它是默认值,这是对的吗?我参考C99第6.2.2节第5条,但stackoverflow.com/questions/1410563的大多数答案都是相反的是一个声明<代码>短i也是一个定义。如果
i
是在其他地方定义的,您不想自己定义它。您知道标准定义的部分吗?如果不是,定义在抽象机器行为方面的意义是什么。第6.9.2节。了解“暂定定义”。
i=2不是废话。编译器正在接受旧C语法的模式下运行。在这种语法中,
i=2
是默认类型为
int
i
的定义。这与前面的
i
声明为
short
相冲突,这就是编译器抱怨类型冲突的原因。
short i;
int i = 2;
short i = 2;
extern short i;
int main(int argc, char **argv) { i = 2; /* more code */ }