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

Например, если у меня есть заголовок с некоторыми объявлениями:

"Заголовок.hpp"

extern int SomeData;

int SomeFunc();

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

"Заголовок.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