Как да дефинираме функции и данни от друго пространство от имена, а не в глобалното?

Например, ако имам заглавка с някои декларации:

"Header.hpp"

extern int SomeData;

int SomeFunc();

И негова реализация (в която декларирам всички функции и глобални променливи в неназовано пространство от имена, за да избегна проблеми със свързването):

"Header.cpp"

#include "Header.hpp"

inline namespace
{
    const int SomeLocalFileData = 9;

    struct MyLocalStructure;

    int SomeLocalFunction(MyLocalStructure *);

    int ::SomeData(SomeLocalFileData);

    int ::SomeFunc()
    {
        return SomeLocalFunction(nullptr);
    }
}

Горният код ще се провали със следните грешки (с помощта на компилатор "gcc"):

грешка: декларация на „SomeData“ не е в пространство от имена около „::“ int ::SomeData(SomeLocalFileData);

грешка: декларация на 'int SomeFunc()' не е в пространство от имена около '::' int ::SomeFunc()

И така, има ли все пак, че мога да декларирам всички мои локални файлови символи да бъдат в анонимно пространство от имена, за да избегна проблеми със свързването, но в същото време да мога да дефинирам моята функция и експортиране на данни.


person AnArrayOfFunctions    schedule 30.11.2014    source източник
comment
Опитахте ли да завършите анонимното пространство от имена точно преди вашите външни символи SomeData и SomeFunc? Тъй като са в една и съща единица за превод, те трябва да имат достъп до вашата локална дефиниция в пространството на анонимните имена.   -  person SleuthEye    schedule 30.11.2014
comment
Така че няма начин да дефинирам глобалните си функции в друго пространство от имена?   -  person AnArrayOfFunctions    schedule 30.11.2014
comment
Функциите трябва да бъдат дефинирани в пространството от имена, в което са декларирани. Можете обаче да дефинирате глобални функции в глобалното пространство от имена, които използват локални символи, дефинирани в анонимно пространство от имена (вижте отговора ми по-долу).   -  person SleuthEye    schedule 02.12.2014


Отговори (2)


Нямате право да дефинирате обект от глобалния обхват във вашето анонимно пространство от имена.

Ако искате да споделите SomeData и SomeFunc() с други компилационни единици, просто трябва да ги дефинирате извън вашето пространство от имена.

Анонимното пространство от имена има за цел да избегне споделянето на вашите символи извън тяхната единица за компилиране. Така че, ако не искате да споделяте символите, дефинирайте ги в пространството на анонимните имена. Декларирането им в заглавка няма да ги направи достъпни за други компилационни единици. Ако искате да запазите дефиницията в заглавка, която е включена само в този файл, можете да затворите дефиницията в анонимно пространство от имена по същия начин.

person Christophe    schedule 30.11.2014

Вярвам, че това, което се опитвате да направите във вашия Header.cpp файл е:

inline namespace
{
  const int SomeLocalFileData = 9;

  struct MyLocalStructure;

  int SomeLocalFunction(MyLocalStructure *);
}

int SomeData(SomeLocalFileData);

int SomeFunc()
{
    return SomeLocalFunction(nullptr);
}

Тъй като са в същата преводна единица и след анонимното пространство от имена, дефинициите на SomeData и SomeFunc имат достъп до локалните символи (напр. SomeLocalFileData, MyLocalStructure и SomeLocalFunction), дефинирани в това анонимно пространство от имена. Тези символи ще останат скрити за други единици за превод.

person SleuthEye    schedule 30.11.2014