C 静态外部vs外部静态
假设我的项目中只有一个名为test.c的文件;如果我没有定义“TRUE”,下面的代码就不会编译。我只是想了解这种行为。请说明这方面的情况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声明为静态变量和外部变量
#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
声明。