C++ 功能原型范围示例

C++ 功能原型范围示例,c++,function,C++,Function,有功能原型范围的定义(3.3.4/1 N3797): 在函数声明中,或在除 函数定义的声明符(8.4),参数名称(如果 提供)具有功能原型范围,该范围在末尾终止 最近的封闭函数声明符的 我们能得到一个描述这个规则的例子吗?这里是一个简单的例子 int a; void f( int a, int a ); 编译器将为第二个参数a发出错误,因为它的名称与第一个参数的名称一致。也就是说,编译器将报告名称a的重新定义。同一名称在同一范围内定义了两次 或者另一个例子 struct A {}; voi

有功能原型范围的定义(3.3.4/1 N3797):

在函数声明中,或在除 函数定义的声明符(8.4),参数名称(如果 提供)具有功能原型范围,该范围在末尾终止 最近的封闭函数声明符的


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

这里是一个简单的例子

int a;

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

或者另一个例子

struct A {};

void f( int A, struct A );

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

下面是一个简单的示例

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 < /代码>声明点上还不知道。因此,
foo
原型中的
struct S
被解释为一种新类型的前向声明。它具有功能原型范围。一旦原型结束,它就超出了范围。这意味着
foo
原型中的
struct S
声明与它后面的
struct S
声明完全无关。这是两种不同的类型。指针
p
in
main
foo
的参数类型不兼容。代码格式不正确


请注意,如果您交换
struct S
的声明和
foo
的原型,则w原型中
struct S
的声明不再是正向声明。假定它引用了先前声明的结构。代码变得正确。

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

void foo(struct S *v);

struct S {
  int i;
};

int main() {
  struct S *p = 0;
  foo(p);           // ERROR: incompatible pointer types
}
<>上述代码不正确(借用C++术语),因为<代码>结构> <代码>在“代码> FoO < /代码>声明点上还不知道。因此,
foo
原型中的
struct S
被解释为一种新类型的前向声明。它具有功能原型范围。一旦原型结束,它就超出了范围。这意味着
foo
原型中的
struct S
声明与它后面的
struct S
声明完全无关。这是两种不同的类型。指针
p
in
main
foo
的参数类型不兼容。代码格式不正确


请注意,如果您交换
struct S
的声明和
foo
的原型,则w原型中
struct S
的声明不再是正向声明。假定它引用了先前声明的结构。代码变得正确。

不确定您要查找的示例。函数声明是一个非常简单的构造。函数原型范围意味着这些参数是可见的,直到函数声明被认为是关闭的(希望我没有误解标准)。就是说比如说,,“你不能有两个同名的参数”@ and RealAfgGuy,我正在寻找一个例子来清楚地显示范围。@ and RealAdfGyA这个问题是一个很好的例子,说明标准如何能使最简单的概念复杂化。@ DmitryFucintv,你应该更新你的个人资料,说你正在制作一个C++编译器。你要找的例子。函数声明是一个非常简单的构造。函数原型范围意味着这些参数是可见的,直到函数声明被认为是关闭的(希望我没有误解标准)。就是说比如说,,你不能有两个同名的参数。@ and RealaFurga.我正在寻找一个例子,清楚地显示了范围。@ and RealAdfGyA这个问题是一个很好的例子,说明标准如何能使最简单的概念复杂化。@ DmitryFucintv,你应该更新你的个人资料,说你正在制作C++编译程序。第一个INTA;在你的例子中可能会产生误导。为了让编译器在原型中报告重复的名称,您不需要声明该变量。@Andrea Laforgia这表明函数原型有自己的声明区域,函数原型中的名称可以在外部声明区域中隐藏名称。如果我使用第一个对象作为函数的默认参数会更好。但是我没有太多时间写一个详细的答案;在你的例子中可能会产生误导。为了让编译器在原型中报告重复的名称,您不需要声明该变量。@Andrea Laforgia这表明函数原型有自己的声明区域,函数原型中的名称可以在外部声明区域中隐藏名称。如果我使用第一个对象作为函数的默认参数会更好。但我没有太多时间写一个详细的答案。