Ошибка объявления в C ++ при использовании extern - PullRequest
0 голосов
/ 24 апреля 2020

Итак, 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.

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

В функции 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;

Таким образом, компилятор выдает ошибку из-за неоднозначных объявлений.

0 голосов
/ 24 апреля 2020

вы можете объявить имя в 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 для двух разных переменных и использует разные области видимости, чтобы различать guish эти значения. Так что это больше не ошибка. Это не рекомендуется, поскольку это может сбить с толку программистов, но это приемлемо для компилятора.

...