用c ++和c命名空格

Dav*_*men 10 c c++ syntax

这并不是说我会永远写这样在我的专业工作下面的代码,下面的代码是合法的,并没有在C++和C编译警告:

#include <stdlib.h>

typedef struct foo { int foo; } foo;

foo * alloc_foo () {
   return (struct foo*) malloc(sizeof(foo));
}   

struct foo * alloc_struct_foo () {
   return (foo*) malloc(sizeof(struct foo));
}   


foo * make_foo1 (int val) {
   foo * foo = alloc_struct_foo (); 
   foo->foo = 0;
   return foo;
}

struct foo * make_foo2 (int val) {
   struct foo * foo = alloc_foo();
   foo->foo = 0;
   return foo;
}
Run Code Online (Sandbox Code Playgroud)

C中的这个合法且明确的含义是C标准的第6.2.3节:

6.2.3标识符的名称空间
如果在翻译单元的任何一点可以看到特定标识符的多个声明,则语法上下文消除了引用不同实体的用法.因此,对于各种类别的标识符(标签名称;结构,联合和枚举的标签;结构或联合的成员;以及普通标识符),存在单独的名称空间.

请注意,由于生活在自己的名称空间中的标签名称,我可以通过在foo某处使用标签使代码更加模糊.

添加以下内容,代码无法编译:

int foo (foo * ptr) {
   return ++ptr->foo;
}   
Run Code Online (Sandbox Code Playgroud)

所以,有两个问题,一个与C和C++有关,另一个与C++有关.

  • C/C++问题:为什么我不能定义函数foo
    看来我应该能够定义这个功能foo; 函数名和变量名是"普通标识符".但是,如果我添加最后一点代码,我会得到error: redefinition of 'foo' as different kind of symbol.
    问题:foo * foo;完全合法,为什么不int foo (foo*);合法?

  • C++问题:这在C++中是如何工作的?
    "名称空间"的含义在C++中的含义与在C中的含义截然不同.我在C++标准中找不到任何关于名称空间的C概念的内容,这就是上述内容在C语言中的合法性.
    问题:在C++中这是合法的(章节和诗歌首选)?

ava*_*kar 8

foo * foo;是完全合法的,为什么不foo (foo*);合法?

因为已存在foo与函数在同一声明上下文中命名的类型.您不能在同一范围内拥有同名的类型和函数.

这在C++中是如何工作的?

因为您可以在嵌套范围中隐藏名称.声明时foo * foo,第一个foo引用类型.第二个foo声明一个变量 - 此时,该类型foo被隐藏.尝试声明foo * bazfoo * foo,它应该失败.

struct foo {};

void test() {
   foo * foo; // first `foo` is the type, second `foo` is the variable
   foo * baz; // first `foo` is the variable
}
Run Code Online (Sandbox Code Playgroud)