我们说我的项目中只有一个名为test.c的文件;如果我没有定义“TRUE”,下面的代码就不会编译。我只是想了解这种行为。请在这方面说清楚。
#ifdef TRUE
static int a;
extern int a;
#else
extern int a;
static int a;
#endif
int main (void)
{
a =10;
printf("%d", a);
return 0;
}
答案 0 :(得分:6)
当未定义TRUE
时,第一个声明(extern
)表示a
具有外部链接(ISO / IEC 9899:1999,6.2.2,第4段,没有事先声明) )。第二个声明(static
)声明a
具有内部联系(第3段)。标识符不能同时具有内部和外部联系(第7段)。
在TRUE
定义的案例中,第二个声明中的extern
没有任何影响,因为先前的声明声明a
具有内部联系(第4段)。
答案 1 :(得分:3)
我不确定你在这里尝试做什么,但是你以不同的顺序重新宣布a
为静态变量和外部变量。
当应用于变量时,static
允许全局变量仅在该文件中可见。 extern
声明一个外部变量,在其他地方定义。因此,例如,如果最初在单独的文件中定义,则将a
声明为extern,如果它仅在此文件本身中可见,则将其声明为static
。
以下是错误:
test.c:8:12: error: static declaration of ‘a’ follows non-static declaration
test.c:7:12: note: previous declaration of ‘a’ was here
您将a
声明为外部变量(在不同的文件中定义),但随后将其重新声明为静态,仅在此文件中可见。
在这种情况下,我会查看那些存储类(extern,static等)的含义,然后决定如何声明变量。
答案 2 :(得分:0)
当您定义TRUE
时,您将a
声明为extern,这意味着a
的定义位于其他文件中,但编译器找不到它,因此它可以'编译你的文件。
另外,我认为你写错了,当没有定义 TRUE时,应该编译这个文件。
答案 3 :(得分:0)
这里的问题是当你没有使用#define TRUE定义TRUE时,编译器在执行#else部分时首先遇到变量'a'的'extern'声明并开始在某个地方预测它在外部作用域中的声明。请记住,在程序开始执行时会分配extern的内存。因此,它在此之后找到另一个静态定义并尝试在编译时分配内存,但由于它不确定extern声明存在冲突。因此,生成错误作为重复声明。
但是当定义并执行第一个条件时,'a'在extern声明之前变为静态,并在编译时分配内存,因此进一步的定义不会发生冲突。我希望这有帮助。 :)