【发布时间】:2011-11-16 04:02:38
【问题描述】:
我正在研究声明和定义的概念(链接、范围、持续时间)。
但我发现了一个无法解释的错误:
以下代码在 gcc 和 Visual Studio 2010 中都可以使用
#include <stdio.h>
extern int a = 7;
extern int a;
int main()
{
printf("%d\n", a);
}
但以下代码在 Visual Studio 中会产生错误,但在 gcc 中没问题:
#include <stdio.h>
static int a = 7;
static int a;
int main()
{
printf("%d\n", a);
}
error C2370: 'a' : redefinition; different storage class
这只是 Visual Studio 编译器中的一个错误吗?
编辑:这个问题原来是 this 的重复。
【问题讨论】:
-
我相信 C 和 C++ 在这个问题上有所不同——我认为 C 专门说同一文件中
static变量的两个定义指的是同一个变量,而 C++ 有这个问题(我可以不记得他们为什么改变它)。确保在 Visual Studio 中编译为 C,而不是 C++。 -
这不是重复的。该问题有一个声明,然后是一个定义,然后是另一个声明。这个没有最初的声明(虽然这看起来像是纯粹的技术性,但它实际上对答案有很大的影响)。
-
hm...为什么定义之前的“额外”声明会产生重大影响?毕竟,“额外”声明将被视为正常声明,因为定义紧随其后。
-
@SHH:嗯,您的第二个 sn-p 是 本质上是该问题中第一个的副本。但是,您的第一个和他的第二个彼此完全不同——您的指定
extern,而他的没有指定任何存储类。对于这些,标准的不同部分是相关的。
标签: c visual-studio gcc static