函数原型范围的例子
Example of function prototype scope
有一个函数原型范围的定义(3.3.4/1 N3797):
在函数声明中,或在除函数定义的声明符(8.4),形参的名称(if(提供)具有函数原型作用域,该作用域在结束时终止最近的封闭函数声明符
我们能得到一个描述该规则的例子吗?
下面是一个简单的例子
int a;
void f( int a, int a );
编译器将对第二个参数a
发出错误,因为它的名字与第一个参数的名字一致。也就是说,编译器将报告名称a
的重新定义。相同的名称在同一作用域中定义两次。
或者另一个例子
struct A {};
void f( int A, struct A );
第一个参数名称隐藏了结构的名称,所以第二个参数使用结构的详细名称来定义。
这个例子涉及到一个相对少见但有时会遇到的错误
void foo(struct S *v);
struct S {
int i;
};
int main() {
struct S *p = 0;
foo(p); // ERROR: incompatible pointer types
}
上面的代码是病态的(借用一个c++术语),因为在声明foo
时struct S
还不知道。因此,foo
原型中的struct S
被解释为新类型的前向声明。它具有函数原型作用域。一旦原型结束,它就超出了范围。这意味着foo
原型中的struct S
声明与随后的struct S
声明完全无关。这是两种不同的类型。main
内部的指针p
与foo
的参数类型不兼容。代码格式错误。
注意,如果你交换struct S
的声明和foo
的原型,在原型中的struct S
的声明不再是前向声明。假定它引用前面声明的struct S
。代码正确
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 功能原型的目的
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 功能原型变量范围C
- 函数原型范围的有趣用法
- 如何调用其原型在另一个函数中范围内的函数
- 函数原型范围的例子