2013-08-29 2 views
2

test.cppАнонимное пространство имен - имеет смысл как в заголовках, так и в кодовых файлах?

#include "test.hpp" 

void f1() { } 

namespace { 
    void f2() {} 
} 

namespace test { 
    void f3() { } 
} 

Пожалуйста, поправьте меня, если я ошибаюсь, но:

  • f1 может быть вызвана из-за пределов, если она объявлена ​​в заголовочном файле илиextern используется
  • f2 не может быть вызван извне
  • f3 может быть вызван извне, если он объявлен в файле заголовка (и правильно префикс - test::). Если он не объявлен в заголовке, его нельзя вызвать?

Я прав?

+0

Клиент может объявить f1 и f3, даже если вы этого не сделаете ... – jiggunjer

ответ

3

Ваш вопрос заголовок вводит в заблуждение. Не ставьте анонимное пространство имен в заголовок.

f2 не может быть вызван из-за пределов test.cpp, правильно.

f1 и f3 можно вызвать, если имеются соответствующие объявления. Они могут быть в заголовке, но ничто не останавливает другие .cpp-файлы от простого кода, который будет быть в заголовке, даже если вы его не предоставите.

Кроме того, extern не требуется для объявлений функций.

void f1(); 
namespace test { 
    void f3(); 
} 
+0

* Не ставьте анонимное пространство имен в заголовке, когда-либо. * - почему? –

+4

Помимо функций, которые бесполезно дублируются в каждый файл cpp, который включает заголовок, он также создает очень тонкие проблемы в некоторых ситуациях, например. если у вас есть встроенная функция в том заголовке, который не находится в анонимном пространстве имен, но использует что-то из анонимного пространства имен. Есть одна ситуация, я знаю, где это правильно, но это очень редко и тонко, и вам это не понадобится, если вы не будете писать сложные библиотеки только для заголовков, например, в Boost. Для 99,99% программистов на С ++ «никогда» это единственное правило, в котором они нуждаются. –

+0

@JoshuaMN http://stackoverflow.com/q/357564/476681 –

Смежные вопросы