使用 extern 时 C++ 中的重新声明错误
Redeclaration Error in C++ when using extern
所以,据我所知,您可以根据需要在 C 中多次声明一个名称,但您不能多次重新定义一个名称。同样按照我的想法,声明是在引入名称时。比如说,编译器会将该名称添加到符号 table 中。定义是为名称分配内存的时间。现在,这里再次声明名称 p。它没有被再次定义。
#include <iostream>
#include <cmath>
float goo(float x)
{
int p = 4;
extern int p;
cout << p << endl;
return floor(x) + ceil(x) / 2;
}
int p = 88;
但是,我收到以下错误:
iter.cpp: In function ‘float goo(float)’:
iter.cpp:53:16: error: redeclaration of ‘int p’
extern int p;
^
iter.cpp:52:9: note: previous declaration ‘int p’
int p = 4;
根据我的说法,int p = 4;
应该在调用堆栈上为 p 分配内存,即引入一个新的局部变量。然后, extern int p 应该再次声明 p。现在 p 应该引用全局变量 p 并且这个 p 应该在函数 goo 的所有后续语句中使用。
在函数 gcd
中,名称 p
被声明两次,引用不同的对象。
float goo(float x)
{
int p = 4;
extern int p;
cout << p << endl;
return floor(x) + ceil(x) / 2;
}
int p = 88;
第一个声明是
int p = 4;
声明局部变量。
而第二个声明是
extern int p;
引用本语句定义的外部变量
int p = 88;
所以编译器发出错误,因为有不明确的声明。
you can declare a name in C as many times as you want, but you cannot redefine a name more than once.
这是错误的,或者至少是不完整的。如果在同一范围内有多个使用相同名称的声明,则它们必须全部声明同一事物。例如,您不能声明 p
同时是局部变量的名称和外部变量的名称。
如果要对不同的事物使用相同的名称,声明必须在不同的范围内。例如
{
int p = 4;
{
extern int p;
extern int p; // Declare the same thing twice if you want.
std::cout << p << std::endl;
}
return floor(x) + ceil(x) / 2;
}
对两个不同的变量使用名称p
,并使用不同的作用域来区分这些含义。所以这不再是一个错误。这是不可取的,因为它会使人类程序员感到困惑,但就编译器而言,这是可以接受的。
所以,据我所知,您可以根据需要在 C 中多次声明一个名称,但您不能多次重新定义一个名称。同样按照我的想法,声明是在引入名称时。比如说,编译器会将该名称添加到符号 table 中。定义是为名称分配内存的时间。现在,这里再次声明名称 p。它没有被再次定义。
#include <iostream>
#include <cmath>
float goo(float x)
{
int p = 4;
extern int p;
cout << p << endl;
return floor(x) + ceil(x) / 2;
}
int p = 88;
但是,我收到以下错误:
iter.cpp: In function ‘float goo(float)’:
iter.cpp:53:16: error: redeclaration of ‘int p’
extern int p;
^
iter.cpp:52:9: note: previous declaration ‘int p’
int p = 4;
根据我的说法,int p = 4;
应该在调用堆栈上为 p 分配内存,即引入一个新的局部变量。然后, extern int p 应该再次声明 p。现在 p 应该引用全局变量 p 并且这个 p 应该在函数 goo 的所有后续语句中使用。
在函数 gcd
中,名称 p
被声明两次,引用不同的对象。
float goo(float x)
{
int p = 4;
extern int p;
cout << p << endl;
return floor(x) + ceil(x) / 2;
}
int p = 88;
第一个声明是
int p = 4;
声明局部变量。
而第二个声明是
extern int p;
引用本语句定义的外部变量
int p = 88;
所以编译器发出错误,因为有不明确的声明。
you can declare a name in C as many times as you want, but you cannot redefine a name more than once.
这是错误的,或者至少是不完整的。如果在同一范围内有多个使用相同名称的声明,则它们必须全部声明同一事物。例如,您不能声明 p
同时是局部变量的名称和外部变量的名称。
如果要对不同的事物使用相同的名称,声明必须在不同的范围内。例如
{
int p = 4;
{
extern int p;
extern int p; // Declare the same thing twice if you want.
std::cout << p << std::endl;
}
return floor(x) + ceil(x) / 2;
}
对两个不同的变量使用名称p
,并使用不同的作用域来区分这些含义。所以这不再是一个错误。这是不可取的,因为它会使人类程序员感到困惑,但就编译器而言,这是可以接受的。