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

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

namespace?

22 ответов

8 просмотров

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

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

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

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

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-плагин, который сам генерировал аналог э...

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

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

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

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Кто-нибудь знает почему SPM клонирует репо целиком? Некоторые репы просто огромные, как та же swift-syntax которая нужна для использования макросов. Сначала подумал, что это...
iMike
6
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Привет. Я верно понимаю, что в определении класса Монад m — зафиксирован (к тому же поскольку это моноид в категории эндофункторов). Т.е. используя байнд я не могу перемещать...
Arseny
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Карта сайта