使用extern时C++中的重新声明错误



因此,AFAIK您可以在C中声明任意多次名称,但不能多次重新定义名称。同样,根据我的想法,声明是指引入一个名字。比如说,编译器会将该名称添加到符号表中。定义是指为名称分配内存的情况。现在,这里再次声明名称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;

因此编译器会发出错误,因为存在不明确的声明。

您可以在C中声明任意多次名称,但不能多次重新定义名称。

这是错误的,或者至少是不完整的。如果在同一范围内有多个使用相同名称的声明,那么它们必须都声明相同的东西。例如,不能同时声明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用于两个不同的变量,并使用不同的作用域来区分这些含义。因此,这不再是一个错误。这是不可取的,因为它会混淆人类程序员,但就编译器而言,这是可以接受的。

相关内容

  • 没有找到相关文章

最新更新