【问题标题】:How is possible to have variable with the same name but different type in c?如何在 c 中具有相同名称但不同类型的变量?
【发布时间】: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 中定义的变量Foofoo.h 中声明的变量Foo 引用不同的实体。此外,struct Foo 与其他 Foos 无关。

标签: c variables types


【解决方案1】:

struct Foo 是您创建的类型,Foo 不是声明变量,它是类型名称的一部分。

名称为Foostruct Foo 类型变量将声明如下:

struct Foo  Foo;
^^^^^^^^^^  ^^^
   ||        |
  type      name

只有这样才会有两个同名的变量:

struct Foo { unsigned val; }; //new type

extern void* Foo; // variable named Foo of type void*
struct Foo Foo;   // variable named Foo of type struct Foo

此代码会产生预期的错误:

error: conflicting types for ‘Foo’

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多