在C&C++中,如何将相同的标识符用于两个不同的东西?



对不起,如果这种类型的问题已经在SO上问过了,但是当我尝试遵循简单的程序时,这对我来说是新的。

#include <stdio.h>
void foo()
{
    puts("foo() is invoked");
}
struct foo
{
    int a;
};
int main()
{
    struct foo f={3}; 
    printf("%dn",f.a);
    foo();
}

我们不应该得到错误吗?如何为两个函数使用相同的标识符?C & &;c++吗?什么C &c++标准对此有规定吗?

标记名(对于结构体、联合和枚举)与标识符(函数、对象和类型定义名称)占用不同的名称空间。标签名通过structunionenum关键字1的存在消除了歧义。

请注意,结构体和联合体成员名称占用了另一个名称空间,并且通过使用.->组件选择操作符在表达式中消除了歧义,因此以下代码是合法的(如果真是一个坏主意):

struct foo { int foo; };
struct foo foo;
foo.foo = some_value();

类型名struct foo通过struct关键字消除了歧义,成员名foo.foo通过.操作符消除了歧义。

以下是你不能做的事情:

  • 不能对结构体联合使用相同的标记名,也不能对结构体枚举使用相同的标记名,等等;你不能这样做:
    struct foo { ... };
    enum foo { ... };
    union foo { ... };
    
    同码;
  • 类型定义名称和对象名称不能使用相同的名称:
    typedef struct foo { int foo; double bar; } foo;
    foo foo;
    
  • 枚举常量和对象名不能使用相同的名称:
    enum blurga { foo, bar, bletch } foo;
  • 函数名和对象名不能使用相同的名称:
    int foo() { ... }
    int bar()
    {
      int foo = foo();
    }
    


<一口> 1。我假设这也是c++中class关键字的情况,但我手边没有参考资料。

类型名称为struct foo;也就是说,当引用结构体时,foo总是在struct之前,所以它显然是结构体而不是函数。此外,由于这不是c++,声明struct foo不会使foo成为类型的名称,因此普通的foo只能引用函数。只有当你尝试这样做时,你才会遇到问题:

typedef struct foo {
    int a;
} foo;

最新更新