使用 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,并使用不同的作用域来区分这些含义。所以这不再是一个错误。这是不可取的,因为它会使人类程序员感到困惑,但就编译器而言,这是可以接受的。