170 похожих чатов

А как на практике защищаются от odr violation для details

namespace?

22 ответов

37 просмотров

в общем случае никак, но если неймспейс как-то учитывает файловую иерархию, то шанс таких ошибок как правило меньше

Есть анонимные нэймспейсы. Не уверен конечно, что сильно поможет. Разве что компайл тайм ошибка будет если два заголовка с одинаковыми объектами в один ТУ подключите

Слава
Есть анонимные нэймспейсы. Не уверен конечно, что ...

Тут не анонимный нейсмспейс нужен, а с одинаковым, но уникальным именем во всех включениях хедера

magras- Автор вопроса
Слава
Есть анонимные нэймспейсы. Не уверен конечно, что ...

Анонимные неймспейсы фактически не работают в хедерах. namespace { int i; } будет создавать в каждом tu свой i. Теоретически в некоторых случаях, они действительно могут решить проблему с odr в хедерах, но я не на столько смелый. =)

magras
Анонимные неймспейсы фактически не работают в хеде...

Кажется, единственное рабочее решение — один раз в определении добавить inline namespace со случайным именем

magras- Автор вопроса
Sergey Skvortsov
Кажется, единственное рабочее решение — один раз в...

Да, кажется, работает. Мне вчера по формулировкам из стандарта показалось, что не должно, но формулировки odr я плохо знаю. Спасибо, попробую.

Сборка с LTO не помогает в этом случае? Ещё мне пришло в голову, что простейшие случаи мог бы ловить Doxygen, но он, увы, просто игнорирует такие ситуации

magras- Автор вопроса
Ofee Oficsu
Сборка с LTO не помогает в этом случае? Ещё мне пр...

Для меня идеальным вариантом было бы сохранить короткие удобные имена, которые могут клашиться. Кажется что inline namespace частично позволяет это, но да, такое решение не будет масштабироваться и его нельзя выставлять в публичный интерфейс. Моя текущая мысль состоит в том, чтобы использовать обычный неймспейс, но нужно научится генерировать препроцессором уникальный id на уровне файла: #define DETAILS // generate unique id namespace DETAILS { void foo(); } void bar() { DETAILS::foo(); }

magras
Для меня идеальным вариантом было бы сохранить кор...

>> научится генерировать препроцессором уникальный id на уровне файла Боюсь, что это очень тернистый путь, даже сами компиляторы уникальные имена для анонимных неймспейсов научились генерировать далеко не сразу

magras
Для меня идеальным вариантом было бы сохранить кор...

С inline namespace проще же #define UNIQ // generate unique id namespace detail { inline namespace UNIQ { void foo(); }} void bar() { detail::foo(); }

magras
Для меня идеальным вариантом было бы сохранить кор...

А ты уверен, что оно правильно работать будет и не будет генерировать два уникальных айди?

magras- Автор вопроса
Sergey Skvortsov
С inline namespace проще же #define UNIQ // genera...

Проблема в том, что // a.h namespace detail { inline namespace UNIQ_123 { void foo(); }} void bar() { detail::foo(); } // b.h namespace detail { inline namespace UNIQ_456 { void foo(); }} void baz() { detail::foo(); } // cpp #include <a.h> #include <b.h> int main() { bar(); baz(); } приведет к конфликту.

magras- Автор вопроса
Ofee Oficsu
>> научится генерировать препроцессором уникальный...

Да, но кажется что даже строя id на имени файла уже можно серьезно уменьшить шансы конфликта.

magras
Проблема в том, что // a.h namespace detail { inl...

Ну тут другого рода конфликт, все-таки Без uniq можно получить нарушение ODR, которое красиво взорвется в рантайме

magras- Автор вопроса
Sergey Skvortsov
Ну тут другого рода конфликт, все-таки Без uniq мо...

В моем снипете DETAILS - это и есть UNIQ. Фактически inline не дает преимуществ по сравнению с использованием просто namespace UNIQ.

magras
В моем снипете DETAILS - это и есть UNIQ. Фактичес...

Будет уникальное имя только в одном месте, а не по всему хедеру, но не больше, да

magras- Автор вопроса
Ofee Oficsu
>> научится генерировать препроцессором уникальный...

Да, кажется что в препроцессоре нельзя преобразовать строку в токен. Без этого я не знаю как получить идентификатор стабильный на уровне файла, а не TU. Передавать снаружи идентификаторы нельзя по той же причине: нужна уникальность на уровне файла, а не TU. В теории рефлексия может помочь, но к ее приходу уже, наверное, можно будет пользоваться модулями. =(

magras
Для меня идеальным вариантом было бы сохранить кор...

А какая проблема решается? Возникают конфликты при single compilation unit?

magras
Проблема в том, что // a.h namespace detail { inl...

Был clang-плагин, который сам генерировал аналог этих UNIQ_xxx и ещё подставлял в символы использование именно этого UNIQ_xxx. Это было сделано для анонимных неймспейсов для single compilation unit, но здесь похожая проблема как вижу

magras- Автор вопроса
Evgeny Sh.
А какая проблема решается? Возникают конфликты при...

Это я так прокрастинирую. -_- Формально проблема описана здесь.

magras- Автор вопроса
Evgeny Sh.
Был clang-плагин, который сам генерировал аналог э...

Плагин это интересно, но все же переносимость мне важнее.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта