以下代码类似于问题初始化变量和声明后立即为其赋值之间是否有区别?两次被否决,所以我有风险;-)
short i;
i = 2;
它不能用 MinGW 和 -std=c99 编译——为什么?第一行是标识符 i 的声明,而不是对象的定义。但是,标识符具有文件范围,因此默认情况下具有外部链接。它可以在别处声明和定义。第二行可以是对该对象的赋值。但是 gcc 抱怨缺少类型或存储类,并且——在猜测类型为 int 之后——关于类型冲突。
以下代码类似于问题初始化变量和声明后立即为其赋值之间是否有区别?两次被否决,所以我有风险;-)
short i;
i = 2;
它不能用 MinGW 和 -std=c99 编译——为什么?第一行是标识符 i 的声明,而不是对象的定义。但是,标识符具有文件范围,因此默认情况下具有外部链接。它可以在别处声明和定义。第二行可以是对该对象的赋值。但是 gcc 抱怨缺少类型或存储类,并且——在猜测类型为 int 之后——关于类型冲突。
你说它short i;
具有文件范围,这对我来说意味着它(编辑:和后续i = 2;
)在函数之外。在函数之外, (编辑)由于语句不能出现在函数之外,“赋值”必须是一个定义。在旧的 C 代码中,没有存储类的定义是一个i = 2;
它本身就是一派胡言;作为语句,它不能出现在函数之外。int
定义,因此您的代码等效于(根据这些规则,看起来 GCC 正在应用):
short i;
int i = 2;
对于 C 编译器来说,这当然是完全无稽之谈。(结束编辑)
通过定义和初始化,您可以或多或少地获得您想要的效果:
short i = 2;
如果您只想声明一个外部变量,这是行不通的;在这种情况下,将初始化放在带有定义的文件中,或者放在您的一个函数中(如下所示)。
extern short i;
int main(int argc, char **argv) { i = 2; /* more code */ }