экспорт пространства имен c ++ - PullRequest
0 голосов
/ 17 февраля 2010

Есть ли в C ++ способ создать анонимное пространство имен и экспортировать из него только одну функцию?

Я хочу что-то вроде:

namespace {
  void Bar() {}
  void Foo() { Bar(); }
}

Теперь я хочу как-то получить доступ к Foo(), но убедиться, что нет возможности прикоснуться к Bar()

Спасибо!

Ответы [ 5 ]

7 голосов
/ 17 февраля 2010

Если вы хотите экспортировать функцию, вам придется поместить ее вне анонимного пространства имен.

namespace {
  void Bar() {};
};
void Foo() { Bar(); };
3 голосов
/ 17 февраля 2010

Поскольку вы хотите, чтобы у Foo() была внешняя связь, вы должны объявить ее в заголовочном файле:

#ifndef FOO_H
#define FOO_H

void Foo();

#endif

Теперь все могут видеть и звонить Foo()

Но в Foo.cpp:

#include "Foo.h"

namespace {
    void Bar(){ }
}

void Foo(){ Bar(); }

Теперь, пока вы управляете исходным файлом Foo.cpp, никто не может изменить доступ к Bar()

2 голосов
/ 17 февраля 2010

Вы можете поместить их в разные заголовочные файлы и убедиться, что клиенты получают только заголовочный файл с объявлением Foo(). Тем не менее, вы не можете внедрить Foo() inline с этим решением.

1 голос
/ 17 февраля 2010

почему бы и нет

namespace {
  void Bar() {};
};
void Foo() { Bar(); };

анонимное пространство имен доступно из файла, в котором вы его создали

0 голосов
/ 17 февраля 2010

Определить Bar как глобальную статическую функцию в файле CPP, который содержит тело функции для Foo.

Изменить: Стоит отметить, что это приведет только к ошибке времени ссылки.
Edit2: И я провел быстрый тест, и кажется, что вы не можете выйти за пределы анонимного пространства имен. Edit3:

Нечто подобное может показаться разумным (и потерять пространство имен)

static void Bar()
{
}

void Foo()
{
    Bar();
}

Теперь вы можете "extern void Foo ();" но если вы попробуете то же самое с Bar, то компоновщик потерпит неудачу, поскольку Bar больше не имеет внешней связи.

...