函数原型范围的示例

问题描述 投票:1回答:2

函数原型范围有一个定义(3.3.4 / 1 N3797):

在函数声明中,或除函数定义(8.4)的声明符之外的任何函数声明符中,参数名称(如果提供)具有函数原型作用域,该作用域终止于最近的封闭函数声明符的末尾。

我们能得到一个描述该规则的例子吗?

c++ function
2个回答
4
投票

这是一个简单的例子

int a;

void f( int a, int a );

编译器将为第二个参数a发出错误,因为它的名称与第一个参数的名称一致。也就是说,编译器将报告重新定义名称a。相同的名称在同一范围内定义两次。

或者另一个例子

struct A {};

void f( int A, struct A );

第一个参数名称隐藏结构名称,因此使用详细的结构名称定义第二个参数。


2
投票

这是一个涉及相对罕见但有时遇到的错误的例子

void foo(struct S *v);

struct S {
  int i;
};

int main() {
  struct S *p = 0;
  foo(p);           // ERROR: incompatible pointer types
}

上面的代码是不正确的(借用C ++术语),因为在struct S声明时尚未知道foo。因此,struct S原型中的foo被解释为新类型的前向声明。它具有功能原型范围。一旦原型结束,它就会超出范围。这意味着在struct S原型中声明foo与其后的struct S声明完全无关。这是两种不同的类型。 p中的指针mainfoo的参数类型不兼容。代码格式不正确。

请注意,如果您交换struct S的声明和foo的原型,则原型中的struct S声明不再是前向声明。假设它是指先前声明的struct S。代码变得正确。

© www.soinside.com 2019 - 2024. All rights reserved.