LINUX.ORG.RU

C++: Как сделать что бы имя класса не экспортировалось в другие модули при линковке?

 


0

3

Как сделать, по аналогии как функции static не экспортируются в другие модули, так и имя какого-нибудь класса так же? Может атрибут какой-нибудь есть?

Сунь класс в безымянный неймспейс.

utf8nowhere ★★★
()

Предыдущий коммент +1

Да, и сейчас объявлять функции со словом static — deprecated. Для этого лучше тоже использовать анонимный неймспейс

anonymous
()
Ответ на: комментарий от KennyMinigun

Не-а, я просто столкнулся на ревью, я запихал пару функций в анонимный неймспейс, меня ткнули носом в правило, что надо статические функции использовать. Ещё странное правило, тоже на ревью наткнулся, мне нужно было реализовать одно и то же действие для разных типов данных, ну я понятное дело, написал шаблонную функцию, нет, нельзя, надо перегрузку юзать.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от rumgot

В C++03 было:

D.2 static keyword

[depr.static]
The use of the static keyword is deprecated when declaring objects in namespace scope (see 3.3.5).

И люди интерпретировали глобальные объявления как объявления в глобальном пространстве имён. В C++11 этого в стандарте уже нет. Так что оно не deprecated.

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

Да, и сейчас объявлять функции со словом static — deprecated. Для этого лучше тоже использовать анонимный неймспейс

Действительно, а есть ли где упоминание, что безымянный namespace не экспортируется? Следующий код вполне себе компилируется:

namespace { struct A { // безымянный намспайс
    int a;
};}

void dosth(::A& s) { // :: - признак глобального намспайса
    qDebug() << s.a;
}

victor79
() автор топика
Ответ на: комментарий от DELIRIUM

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

А в кодовой базе LLVM шаблонные функции/классы активно используются? Возможно, там как в Qt, стараются лишний раз их не использовать из-за проблем с древними компиляторами и платформами.

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

Используются, но не очень активно. Проблемы древних компиляторов не сильно их заботят, там 17й стандарт во все поля. Ну и там, где используются, там финты ушами вроде статического полиморфизма. От некоторых мест Александреску бы с ума сошёл.

DELIRIUM ☆☆☆☆☆
()
Последнее исправление: DELIRIUM (всего исправлений: 1)
Ответ на: комментарий от DELIRIUM

Не-а, я просто столкнулся на ревью, я запихал пару функций в анонимный неймспейс, меня ткнули носом в правило

Мде… сложно с ними согласится. Особенно важности причины. Но она по крайней мере есть.

https://llvm.org/docs/CodingStandards.html#anonymous-namespaces

The problem with anonymous namespaces is that they naturally want to encourage indentation of their body, and they reduce locality of reference: if you see a random function definition in a C++ file, it is easy to see if it is marked static, but seeing if it is in an anonymous namespace requires scanning a big chunk of the file.

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

О, дополнили статью походу, просто у меня это на ревью всплыло года три назад.

Я не согласен тоже.

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

Есть атрибут visibility, в сочетании с -fvisibility=hidden -fvisibility-inlines-hidden позволяет экспортировать только то, что явно обозначено

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

В венде издавна всякие __attribute__((dllexport)) напиханы. А тут не заглядывал в мануал гцц и не знаешь про 100500 релевантных опций.

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

Так то - разные вещи, особенно с переменными. Может и порядок инициализации отличаться и размещение.

сейчас объявлять функции со словом static — deprecated

Пруфец бы.

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