LINUX.ORG.RU

Предекларация функции в анонимном пространстве имён C++

 ,


0

2

Доброго времени, коллеги.

namespace abc
{
	void f1(void);
}

void abc::f1(void)
{
	wprintf(L"abc::f1()\n");
}

namespace
{
	void f2(void);
}
Видим, что abc::f1() реализована вне тела пространства имён abc, с предварительным объявлением в теле пространства.

Как сделать то же самое для f2() так же вне границ пространства имён?

★★★

Последнее исправление: hobbit (всего исправлений: 1)

Насколько мне известно, никак, только тоже оборачивать определение функции в анонимное пространство имён.

Для свободных функции и глобальных переменных можно вместо анонимного пространства имён пользоваться спецификатором класса памяти static. С ним предекларации тоже работают как надо.

Ну а с членами классов такой проблемы не будет, там можно оборачивать в анонимное пространство имён только само определение класса.

lwo
()
Последнее исправление: lwo (всего исправлений: 2)

Анонимное пространство имён и так находится в cpp файле. Какой смысл бить на части? Ну попробуй предварительную декларацию. Может заработает. Но всё равно будет внутри анонимного пространства имён.

namespace
{
    void f1(void); // forward declaration
    void f2(void); 
    ...
    ...
    ...
    void f1(void)
    {
        // implementation
    }

    void f2(void)
    {
        
    }

}

ox55ff ★★★★★
()

А зачем void в параметрах функции? На си код всё равно не соберётся из-за namespace.

fluorite ★★★★★
()
Ответ на: комментарий от ox55ff

Какой смысл бить на части?

Что бы избавиться от лишнего отступа от края страницы при написании кода определения функции.

normann ★★★
() автор топика
Ответ на: комментарий от ox55ff

Не красиво как-то на мой взгляд. Ну конечно придётся за неимением других возможностей, в случае если набегут те, кто кричит, что static это не кошерно.

normann ★★★
() автор топика
Последнее исправление: normann (всего исправлений: 1)

Ну так оно на то и анонимное, что к нему нельзя по имени обратиться.. это для всяких там adl и прочего. Возможно не стоит его использовать? Или назвать как то.

zerhud
()
Ответ на: комментарий от utf8nowhere

Напиши inline namespace и можешь определять вне (void ::f2() { … })

Чёрт, да, это то, что нужно. Спасибо.

normann ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.