【发布时间】:2020-12-09 03:05:55
【问题描述】:
拥有这个头文件和 .c 文件:
foo.h
extern void * Foo;
struct Foo { unsigned val; };
foo.c
int main(){
void * Foo;
}
它编译正确,但有 2 个变量,有 2 种不同类型(void*,struct {...})但名称相同。
这怎么可能?
编译器如何知道哪个是哪个?
【问题讨论】:
-
struct Foo { unsigned val; };声明类型struct Foo,而不是变量。 -
所以如果我在名为
Foo的变量之前不使用struct Foo,编译器将始终假定表示void*,因为它是extern?如果我做了extern struct Foo会怎样? -
您的代码中有两个不同的变量,但它们的类型相同。
extern void* Foo;声明了一个名为Foo的全局变量,它已声明但从未定义(因此,如果您尝试使用它,则会出现链接器错误),而void * Foo;在main中定义了一个与全局变量。 -
如果您有
struct Foo { /*whatever;*/ };,则标识符Foo本身在C 中并不“存在”。您需要typedef struct Foo { /*whatever;*/ } Foo;在全局命名空间中创建标识符。在第一种情况下,标识符Foo存在于结构命名空间中:struct Foo -
main中定义的变量Foo和foo.h中声明的变量Foo引用不同的实体。此外,struct Foo与其他Foos 无关。