在C++中使用extern时重声明错误。

问题描述 投票:0回答:1

所以,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的所有后续语句中使用。

c++ compiler-errors scope global-variables forward-declaration
1个回答
0
投票

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


1
投票

在函数 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;

所以编译器发出错误,因为有模棱两可的声明。

© www.soinside.com 2019 - 2024. All rights reserved.