C 静态外部vs外部静态

C 静态外部vs外部静态,c,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; } 我不确定您在这里试图做什么,但您正在以不同的顺序将a声明为静态变量和外部变量

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

我不确定您在这里试图做什么,但您正在以不同的顺序将
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等)的含义,然后决定如何声明变量。

当您定义
TRUE
时,您将
a
声明为extern,这意味着
a
的定义在其他文件中,但编译器找不到它,所以它无法编译您的文件


另外,我认为您在问题中写错了,当您没有定义TRUE时,应该编译此文件。

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

TRUE
定义的情况下,第二次声明中的
extern
没有影响,因为之前有一次声明声明
a
具有内部链接(第4段)


请参阅。

这里的问题是,如果您不使用#define TRUE定义TRUE,编译器在执行#else部分时首先遇到变量“a”的“extern”声明,并开始在某个外部作用域中预期其声明。请记住,外部程序的内存是在程序开始执行时分配的。因此,它会在这之后找到另一个静态定义,并尝试在编译时分配内存,但由于它不确定extern声明,所以存在冲突。因此,将生成一个错误作为重复声明

但是,当定义true并执行第一个条件时,“a”在extern声明之前是静态的,并在编译时分配内存权限,因此进一步的定义不会冲突。我希望这有帮助。:)


阅读此链接

当某些内容未编译时,最好发布错误消息。在GCC上,当定义了
TRUE
时,它可以正常编译,但如果没有定义,则不会。我猜GCC可能会在解析
静态
声明后忽略
extern
声明。