2016-06-10 34 views
9

据我了解,在C++中,内部函数参数列表中声明一个类自动进入封闭范围:类声明

void f(struct A *p) {} 

void g() { A *p; f(p); } 

等同于:

struct A; 

void f(A *p) {} 

void g() { A *p; f(p); } 

什么节在C++标准中指定了这种行为?那么C呢?

嗯,我猜C在这种情况下不遵循C++。 Visual Studio中不编译这个代码是C模式:

void g(struct A { int a; } a); 

struct A a;  // 'a' uses undefined struct 'A' 
+1

你的最后一个例子也不能用C++编译。 – molbdnilo

+0

是的,我忘了注意C++不允许在函数参数列表里面定义类的定义。我的意思是,在这种情况下,C没有遵循C++,参数列表中的类声明'泄漏'到函数声明范围中。 – igntec

回答

3

这是一个阐述型符。 C语言中的相关报价++ 14:

[basic.lookup.elab]/2: [...]如果详细拟订类型说明符由 的类键引入此查找没有找到先前声明类型名,或者如果阐述型说明符 出现在与声明的形式:

class-key attribute-specifier-seqopt identifier ; 

è laborated-type-specifier是一个声明,它引入了3.3.2中描述的类名。

这声明的类名称,象这样:

[basic.scope.pdecl]/7:第一声明的类的声明的点阐述型说明符如下:

- [。 ..]

- 对于阐述型说明符的形式为

class-key identifier 

如果详细制定型说明符DECL说明符-SEQ或命名空间范围定义的函数的参数声明子句中使用的,识别符被声明为类 - 包含声明的名称空间中的名称;否则,除作为朋友声明外,标识符在包含该声明的最小名称空间或块范围内声明。

是因为struct A阐述型符A以前尚未宣布,A在包含声明(在这种情况下,全局命名空间)的命名空间中声明。