[英]What is wrong with extern short i; i=2; ? gcc complains type conflict
以下代码与问题类似: 初始化变量和在声明后立即为其赋值之间是否有区别? 两次否决票,所以我处于危险之中;-)
short i;
i = 2;
它不能与MinGW和-std = c99一起编译-为什么? 第一行是标识符i的声明,而不是对象的定义。 但是,标识符具有文件范围,因此默认情况下具有外部链接。 它可以在其他地方声明和定义。 第二行可以是对该对象的分配。 但是gcc抱怨缺少类型或存储类,并且在猜测类型为int之后抱怨类型冲突。
你说short i;
吗short i;
具有文件范围,这对我来说意味着它( 编辑:和随后的i = 2;
)在函数之外。
在函数之外,
i = 2;
完全是胡说八道;
作为声明,它不能出现在函数外部。
(编辑)由于语句不能出现在函数外部,因此“赋值”必须是定义。 在旧的C代码中,没有存储类的定义是一个int
定义,因此您的代码(在这些规则下,看起来就像GCC正在应用)等效于:
short i;
int i = 2;
当然,对于C编译器而言,这完全是胡说八道。 (结束编辑)
通过定义和初始化,您可以获得或多或少的效果:
short i = 2;
如果仅希望声明一个外部变量,则此方法不起作用。 在这种情况下,请将初始化放在带有定义的文件中,或者放在您的函数之一中(如下所示)。
extern short i;
int main(int argc, char **argv) { i = 2; /* more code */ }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.