如何将相同的标识符用于C& C中的两个不同的事情。 C ++?

时间:2015-06-09 18:41:17

标签: c++ c uniqueidentifier identifier

很抱歉,如果已经在SO上询问过这类问题,但在我尝试使用简单程序时,这对我来说是新的。

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

我们不应该收到错误吗?如何使用相同的标识符来兼顾功能和功能。 C&amp;中的结构C ++?什么是C&amp; C ++标准说到这个?

2 个答案:

答案 0 :(得分:1)

标记名称(用于结构,联合和枚举)从标识符(函数,对象和typedef名称)中占用不同的名称空间。标记名称通过structunionenum关键字 1 的存在来消除歧义。

请注意,struct和union 成员名称占用了另一个名称空间,并且通过使用.->组件选择运算符在表达式中消除歧义,因此以下代码是合法的(如果一个非常糟糕的主意):

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

类型名称struct foostruct关键字的存在消除歧义,成员名称foo.foo.运算符的存在消除歧义。

以下是无法做的事情:

  • 您不能为结构使用相同的标记名称,或者结构使用枚举等; IOW,你做不到:
    struct foo { ... };
    enum foo { ... };
    union foo { ... };
    
    使用相同的代码;
  • 您不能对typedef名称使用相同的名称​​和对象名称:
    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关键字的情况,但我没有那个参考方便。

答案 1 :(得分:0)

类型名称为struct foo;也就是说,在引用结构时,foo总是以struct开头,所以它明确地是结构而不是函数。此外,由于这不是C ++,因此声明struct foo不会使foo成为该类型的名称,因此普通foo只能引用该函数。如果您尝试这样做,您将只会遇到问题:

typedef struct foo {
    int a;
} foo;