对不起,如果这种类型的问题已经在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++标准对此有规定吗?
标记名(对于结构体、联合和枚举)与标识符(函数、对象和类型定义名称)占用不同的名称空间。标签名通过struct
、union
或enum
关键字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;