很抱歉,如果已经在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 ++标准说到这个?
答案 0 :(得分:1)
标记名称(用于结构,联合和枚举)从标识符(函数,对象和typedef名称)中占用不同的名称空间。标记名称通过struct
,union
或enum
关键字 1 的存在来消除歧义。
请注意,struct和union 成员名称占用了另一个名称空间,并且通过使用.
或->
组件选择运算符在表达式中消除歧义,因此以下代码是合法的(如果一个非常糟糕的主意):
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
关键字的情况,但我没有那个参考方便。
答案 1 :(得分:0)
类型名称为struct foo
;也就是说,在引用结构时,foo
总是以struct
开头,所以它明确地是结构而不是函数。此外,由于这不是C ++,因此声明struct foo
不会使foo
成为该类型的名称,因此普通foo
只能引用该函数。如果您尝试这样做,您将只会遇到问题:
typedef struct foo {
int a;
} foo;