Вопрос по namespaces, c++, scope, terminology – Глобальная область действия против глобального пространства имен

55

Я видел использование этих двух фраз: глобальная область и глобальное пространство имен. В чем разница между ними?

Ваш Ответ

5   ответов
4

& Quot; Объем & Quot; является более общим термином, чем «пространство имен». класс и кодовый блок определяют область, в которой могут использоваться объявленные внутри них имена; пространство имен - это контейнер для имен, объявленных вне классов и функций.

& quot; Глобальный охват & quot; и & quot; глобальное пространство имен & quot; может использоваться более или менее взаимозаменяемо; область действия имени, объявленного в пространстве имен, охватывает все пространство имен. Используйте & quot; пространство имен & quot; если вы конкретно ссылаетесь на пространство имен и «область действия» если вы ссылаетесь на видимость имен внутри него.

2

Тема немного устарела, но я хочу предложить свою помощь по этому поводу. Я думаю, что вы не должны делать вещи сложнее, чем они есть на самом деле.Scope Идентификатор - это часть компьютерной программы, где идентификатор, имя, которое относится к некоторому объекту в программе, может использоваться для поиска упомянутого объекта. Таким образом, термин область действия применяется только к идентификаторам, и мы не должны смешивать его с временем жизни объекта. Они несколько связаны, но не должны быть перепутаны. Время жизни объекта обозначается тем, где мы выделяем память для этого объекта. Так, например, если в стеке выделена память, она будет освобождена после завершения функции. Так что это зависит от того, где мы храним объект, и это обозначает его время жизни. Область действия только говорит: «Вот имя для объекта, и мы можем использовать это имя для объекта до тех пор, а затем». Итак, как я уже сказал, терминscope только для идентификаторов объектов, а время жизни - это то, что обозначается тем, где мы храним объект.

Кроме того, я хочу сказать кое-что оlinkage который тесно связан с этим. Это также может иногда сбивать с толку. Допустим, у нас есть некоторые идентификаторы вtranslation unit которые относятся к некоторым объектам. Будь то же идентификаторы вother Единица перевода будет ссылаться на те же сущности, обозначается связью. Так, например, если идентификатор имеет внешнюю связь, мы можем сослаться на сущность, к которой относится этот идентификатор, но из другой единицы перевода, объявив ее ключевым словомextern, Теперь предположим, что мы не хотим использовать эту сущность в других единицах перевода. Тогда сущность будетexist пока программа не закончится, но когда мы не объявим ее, мы не сможем сослаться на нее. Также обратите внимание, что теперь я смешал термины связь и время жизни. Но это потому, что толькоglobal сущности имеют внешнюю связь. На идентификатор внутри функции нельзя ссылаться из других частей программы.

Вывод: всегда старайся быть простым. Я был удивлен, как разные люди по-разному говорят об этих терминах. Весь процесс отдельной компиляции сбивает с толку, потому что есть несколько терминов, которые имеют почти одинаковое значение, и, вероятно, каждый застрянет на этом этапе.

78

за пределами которой оно не существует. Область действия может быть определена многими способами: она может быть определенаnamespace, functions, classes и просто{ }.

Таким образом, пространство имен, глобальное или иное, определяет область действия. Глобальное пространство имен относится к использованию::и символы, определенные в этом пространстве имен, имеют глобальную область видимости. Символ по умолчанию существует в глобальном пространстве имен, если только он не определен внутри блока, начинающегося с ключевого слова.namespaceили это член класса или локальная переменная функции:

int a; //this a is defined in global namespace
       //which means, its scope is global. It exists everywhere.

namespace N
{
     int a;  //it is defined in a non-global namespace called `N`
             //outside N it doesn't exist.
}
void f()
{
   int a;  //its scope is the function itself.
           //outside the function, a doesn't exist.
   {
        int a; //the curly braces defines this a's scope!
   }
}
class A
{
   int a;  //its scope is the class itself.
           //outside A, it doesn't exist.
};

Также обратите внимание, чтоname может быть скрыто внутренней областью, определенной пространством имен, функцией или классом. Итак, имяa внутри пространства именN скрывает имяa в глобальном пространстве. Точно так же имя в функции и классе скрывает имя в глобальном пространстве имен. Если вы столкнулись с такой ситуацией, то вы можете использовать::a чтобы обратиться к имени, определенному в глобальном пространстве имен:

int a = 10;

namespace N
{
    int a = 100;

    void f()
    {
         int a = 1000;
         std::cout << a << std::endl;      //prints 1000
         std::cout << N::a << std::endl;   //prints 100 
         std::cout << ::a << std::endl;    //prints 10
    }
}
@rimiro: еслиa объявлен в области видимости функции, вы не можете получить к нему доступ изoutside функция.
Что нам следует делать, если мы хотим получить доступ к & a; (определяется в пространствах имен N) внутри функции void f () {}
4

вы можете иметь глобальную переменную, которая будет существовать до тех пор, пока ваша программа будет выполняться, или вы можете иметь переменную с областью действия блока, которая будет существовать до тех пор, пока выполняется этот блок кода. Рассмотрим этот пример:

#include <iostream>

int a = 100;

main () {
    int a = 200;

    std::cout << "local a is: " << a << std::endl;
    std::cout << "global a is: " << ::a << std::endl;

    return 0;
}

После выполнения выписка будет напечатанаlocal a is: 200очевидно, что мы переопределяемa вmain который выходит в объем его включающего блока. Мы также печатаем глобальный::a который снова печатает ожидаемое значение 100, потому что мы запросили глобальное пространство имен::.

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

Область действия, с другой стороны, обозначает срок службы объекта, глобальногоa возникли до того, как местныйa потому что он создается намного раньше, чем исполняется main. Тем не менее, сфера такжеforces пространство имен на символе, но не так, какnamespace делает. Есть разные виды прицелов,global, class, function, block, file так далее...

Смущает то, что область видимости иногда перегружается для обозначения видимости определенного символа, который заимствован из C, где понятия пространств имен не существовало, а область использовалась для обозначения как продолжительности жизни, так и видимости. В C ++, однако, правила немного изменились, но терминscope все еще используется одинаково, потому что два языка имеют много общих понятий.

Хорошо, что вы выдвинули на первый план идею, что область действия присуща времени жизни объекта.
3

int i например, мы говоримi is in the global namespace а такжеhas the global namespace scope, Вот и все.

Excerpt From C++03:

3.3.5 Namespace scope   

    The outermost declarative region of a translation unit is also a namespace, called
  the global namespace. A name declared in the global namespace has global namespace
  scope (also called global scope).

Похожие вопросы