Переменные(help)

224
03 марта 2017, 01:48

Как распространить видимость глобальной переменной на два файла? Может ли в блоке быть объявлена extern-переменная для расширения области видимости глобальной переменной? Можно ли внутри блока изменять значение глобальной переменной? Могут ли имена глобальной переменной и переменной, определенной внутри блока, совпадать? Могут ли несколько файлов иметь глобальную переменную с одинаковым именем?

Answer 1

Как распространить видимость глобальной переменной на два файла?

Нужно поместить объявление переменной со спецификатором extern в заголовочный файл, и включить этот заголовок в два файла с кодом. При этом определить переменную следуют только в одном файле.

Может ли в блоке быть объявлена extern-переменная для расширения области видимости глобальной переменной?

В C++ вы можете использовать квалифицированное имя переменной, указывая перед именем переменной имя пространства имен, где переменная объявлена. Например, если переменная x объявлена в глобальном пространстве имен, то для обращения к ней вы можете использовать имя ::x.

Вы также можете в C и в C++ объявить внешнюю переменную в блоке кода, снабдив объявление спецификатором extern.

Можно ли внутри блока изменять значение глобальной переменной?

Если переменная не объявлена с c/v квалификатором, то вы можете ее изменять.

Могут ли имена глобальной переменной и переменной, определенной внутри блока, совпадать?

Как уже было упомянуто, в C++ для глобальной переменной вы можете использовать квалифицированное имя, благодаря чему оно будет отличаться от имени локальной переменной. В противном случае имя локальной переменной будет скрывать имя глобальной переменной.

Могут ли несколько файлов иметь глобальную переменную с одинаковым именем?

Если переменная имеет внутреннее связывание, то в каждой единице трансляции эта переменная будет представлять отдельный объект. Если же она имеет внешнее связывание, то все переменные, объявленные с тем же именем и внешним связыванием будут обозначать один и тот же объект.

В заключении пример простой программы, в которой поведение переменных, объявленных со спецификатором extern , в языках C и C++ совпадают

#include <iostream>
extern int x = 10;
int main() 
{
    std::cout << "x = " << x << std::endl;
    {
        int x = 20;
        std::cout << "x = " << x << std::endl;
        {
            extern int x;
            x = 30;
            std::cout << "x = " << x << std::endl;
        }
        std::cout << "x = " << x << std::endl;
    }       
    std::cout << "x = " << x << std::endl;
    return 0;
} 

Вывод программы на консоль

x = 10
x = 20
x = 30
x = 20
x = 30
READ ALSO
Проверка пароля по символьно на голом js

Проверка пароля по символьно на голом js

Необходимо сделать проверку пароля в режиме живого времени по каждому символуТ

214
Сравнение null vs object

Сравнение null vs object

Почему null === null // true ?

222
посчитать вхождения в массив

посчитать вхождения в массив

Считаю вхождения true в массивПомогите разобраться как сделать проверку на 0, undefined, null

274