这并不是说我会永远写这样在我的专业工作下面的代码,下面的代码是合法的,并没有在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++中这是合法的(章节和诗歌首选)?
foo * foo;是完全合法的,为什么不foo (foo*);合法?
因为已存在foo与函数在同一声明上下文中命名的类型.您不能在同一范围内拥有同名的类型和函数.
这在C++中是如何工作的?
因为您可以在嵌套范围中隐藏名称.声明时foo * foo,第一个foo引用类型.第二个foo声明一个变量 - 此时,该类型foo被隐藏.尝试声明foo * baz后foo * 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)
| 归档时间: |
|
| 查看次数: |
462 次 |
| 最近记录: |