static extern vs extern static

时间:2011-09-20 11:59:52

标签: c

我们说我的项目中只有一个名为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;
}

4 个答案:

答案 0 :(得分:6)

当未定义TRUE时,第一个声明(extern)表示a具有外部链接(ISO / IEC 9899:1999,6.2.2,第4段,没有事先声明) )。第二个声明(static)声明a具有内部联系(第3段)。标识符不能同时具有内部和外部联系(第7段)。

TRUE定义的案例中,第二个声明中的extern没有任何影响,因为先前的声明声明a具有内部联系(第4段)。

请参阅draft of ISO/IEC 9899:1999

答案 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声明之前变为静态,并在编译时分配内存,因此进一步的定义不会发生冲突。我希望这有帮助。 :)

阅读此链接http://www.tenouk.com/ModuleZ.html