"local variables at the outermost scope of the function may not use the same name as any parameter" 是什么意思?
What does "local variables at the outermost scope of the function may not use the same name as any parameter" mean?
我一直在阅读 C++ primer 第 5 版。 6.1章功能参数表第三段。
它写道:“此外,函数最外层范围内的局部变量不得使用与任何参数相同的名称”。
这是什么意思?
我的母语不是英语。我不明白函数"outermost scope"的实际含义。
这意味着你不能做这样的事情:
void foo (int x)
{
int x = 4; //in the outermost scope, invalid
}
但是,您可以这样做:
void foo (int x)
{
{ //this introduces a new scope
int x = 4; //not in the outermost scope, valid
}
}
表示这个无效:
void f(int p)
{
int p = 3;
}
鉴于此
void f(int p)
{
{
int p = 3;
}
}
允许。
函数的最外层作用域是定义函数体的块。您可以将其他(内部)块放入其中,并在该块的本地变量中声明变量。内部块中的变量可以与外部块中的变量或函数参数具有相同的名称;他们将名称隐藏在外部范围内。外部块中的变量不能与函数参数同名。
演示:
void f(int a) // function has a parameter
{ // beginning of function scope
int b; // OK: local variable
{ // beginning of inner block
int a; // OK: hides parameter
int b; // OK: hides outer variable
} // end of inner block
int a; // Error: can't have same name as parameter
}
假设您有一个函数 'foo',它接受一个整数参数 'bar'。
int foo (int bar)
{
int bar = 0; // < illegal, this is the 'outermost' scope
if (bar == 10) {
int bar = 5; // legal (though unadvisable) this 'shadows' the passed-in 'bar'
return bar;
}
return bar;
}
'bar' 的第一个内部声明是非法的,因为传入的参数也在同一上下文中声明(即使语法不一定清楚。)
正如这样写是不正确的:
int bar;
char bar[10];
因为这两个变量共享相同的作用域。
bar 的第二个声明(在上面的函数 foo 中)是合法的(尽管通常是个坏主意)因为它是在 'if' 的内部范围内声明的,因此是公平的游戏。
希望对您有所帮助。
此规则不仅对函数定义的函数参数有效,而且对迭代和条件语句以及异常处理程序也有效
3.3.3 块作用域
2 The potential scope of a function parameter name (including one
appearing in a lambda-declarator) or of a function-local predefined
variable in a function definition (8.4) begins at its point of
declaration. If the function has a function-try-block the potential
scope of a parameter or of a function-local predefined variable ends
at the end of the last associated handler, otherwise it ends at the
end of the outermost block of the function definition. A parameter
name shall not be redeclared in the outermost block of the function
definition nor in the outermost block of any handler associated with a
function-try-block.
3 The name declared in an exception-declaration is local to the
handler and shall not be redeclared in the outermost block of the
handler.
4 Names declared in the for-init-statement, the for-range-declaration,
and in the condition of if, while, for, and switch statements are
local to the if, while, for, or switch statement (including the
controlled statement), and shall not be redeclared in a subsequent
condition of that statement nor in the outermost block (or, for the if
statement, any of the outermost blocks) of the controlled statement;
see 6.4.
例如这个代码片段是无效的
if( int x = SomeFunction() )
{
int x; // invalid declaration
//...
}
我一直在阅读 C++ primer 第 5 版。 6.1章功能参数表第三段。 它写道:“此外,函数最外层范围内的局部变量不得使用与任何参数相同的名称”。 这是什么意思?
我的母语不是英语。我不明白函数"outermost scope"的实际含义。
这意味着你不能做这样的事情:
void foo (int x)
{
int x = 4; //in the outermost scope, invalid
}
但是,您可以这样做:
void foo (int x)
{
{ //this introduces a new scope
int x = 4; //not in the outermost scope, valid
}
}
表示这个无效:
void f(int p)
{
int p = 3;
}
鉴于此
void f(int p)
{
{
int p = 3;
}
}
允许。
函数的最外层作用域是定义函数体的块。您可以将其他(内部)块放入其中,并在该块的本地变量中声明变量。内部块中的变量可以与外部块中的变量或函数参数具有相同的名称;他们将名称隐藏在外部范围内。外部块中的变量不能与函数参数同名。
演示:
void f(int a) // function has a parameter
{ // beginning of function scope
int b; // OK: local variable
{ // beginning of inner block
int a; // OK: hides parameter
int b; // OK: hides outer variable
} // end of inner block
int a; // Error: can't have same name as parameter
}
假设您有一个函数 'foo',它接受一个整数参数 'bar'。
int foo (int bar)
{
int bar = 0; // < illegal, this is the 'outermost' scope
if (bar == 10) {
int bar = 5; // legal (though unadvisable) this 'shadows' the passed-in 'bar'
return bar;
}
return bar;
}
'bar' 的第一个内部声明是非法的,因为传入的参数也在同一上下文中声明(即使语法不一定清楚。)
正如这样写是不正确的:
int bar;
char bar[10];
因为这两个变量共享相同的作用域。
bar 的第二个声明(在上面的函数 foo 中)是合法的(尽管通常是个坏主意)因为它是在 'if' 的内部范围内声明的,因此是公平的游戏。
希望对您有所帮助。
此规则不仅对函数定义的函数参数有效,而且对迭代和条件语句以及异常处理程序也有效
3.3.3 块作用域
2 The potential scope of a function parameter name (including one appearing in a lambda-declarator) or of a function-local predefined variable in a function definition (8.4) begins at its point of declaration. If the function has a function-try-block the potential scope of a parameter or of a function-local predefined variable ends at the end of the last associated handler, otherwise it ends at the end of the outermost block of the function definition. A parameter name shall not be redeclared in the outermost block of the function definition nor in the outermost block of any handler associated with a function-try-block.
3 The name declared in an exception-declaration is local to the handler and shall not be redeclared in the outermost block of the handler.
4 Names declared in the for-init-statement, the for-range-declaration, and in the condition of if, while, for, and switch statements are local to the if, while, for, or switch statement (including the controlled statement), and shall not be redeclared in a subsequent condition of that statement nor in the outermost block (or, for the if statement, any of the outermost blocks) of the controlled statement; see 6.4.
例如这个代码片段是无效的
if( int x = SomeFunction() )
{
int x; // invalid declaration
//...
}