如下的c代码:
#include <stdio.h>
#define CASE0
#if defined CASE0
static int a = 1;
static int a;
#elif defined CASE1
static int a;
static int a = 1;
#elif defined CASE2
int a = 1;
int a;
#else //CASE3
int a;
int a = 1;
#endif
int main (void)
{
printf("%d\n", a);
return 0;
}
在打开CASE0时,vs2010报错:error C2370: “a”: 重定义;不同的存储类(vc6也报类似的错误)。
其余三种情况都是编译通过的(四种情况都是使用c方式编译)。
按照c标准的说法,static int a;和int a;都是临时定义,当存在对应的显示定义时,采用该显示定义。即CASE0和CASE1应该是一样的,CASE2和CASE3是一样的(gcc就是这样)。
难道是vc对static类型的临时定义做特殊处理了?