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

Изза того что MSVC манглит struct/class имена по разному, при

компиляции объектов которые декларированы по разному он продюсит ворнинг C4099.
Есть что-то в стандарте, что уравнивает семантику объявлений struct ForwardDeclaration; и class ForwardDeclaration; или мсвц в полном праве полагаться что это разные объявления?
И если семантика разная, то никто не хочет это починить с whatever ForwardDeclaration;? Еще бы и тайп альясы туда присобачить.

32 ответов

16 просмотров

Зачем по разному декларировать один и тот же тип

вроде как в стандарте есть, что struct/class идентичны

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Denis P
Зачем по разному декларировать один и тот же тип

Потому что ты не помнишь. Потому что поменяли оригинальный тип, но не форварды

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Denis P
Ну тогда ссзб

Это стреляет неприятно, когда у вас меняется тип в фреймворке, а клиенты живут в своих проектах и им надо идти менять форварды. Чинится тем что многие делают forward.hpp с форвардами, заодно и со всеми тайпалиасами, но это костыль, который не хочется делать

Aleksei Kuznetsov Kuznetsov
Это стреляет неприятно, когда у вас меняется тип в...

не меняйте так публичное апи) внезапная идея переделать class на struct кажется немного странной

Феномен Баадера-Майнхоф, никогда такого не ловил и вдруг перепутал struct на class в forward declaration, все скомпилили а в msvc unresolved external 😂

Мс-вс поступает абсолютно корректно. Манглинг не является частью стандарта и отдан на откуп имплементации. Имплементация Мс-вс максимально строгая. В манглинг включается не только class/struct, но и retval и public/private и static и .. я хз ещё что. Чуть сбаловался - давай разбирайся.

Int Unsigned
Мс-вс поступает абсолютно корректно. Манглинг не я...

Разобраться бывает сложно :) Оно на этапе компиляции видя что class/struct расходятся не сказало ничего. Более того, оно выдумало несуществующую функцию class T& foo() (хотя она struct T& foo()) и объявило её unresolved.

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Int Unsigned
Мс-вс поступает абсолютно корректно. Манглинг не я...

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

но класс и стракт не идентичны, у них есть различия) Никто и не говорил, что их можно вместо друг друга использовать

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
но класс и стракт не идентичны, у них есть различи...

для форварда это не имеет значения, что это дает при манглинге тоже неясно

Aleksei Kuznetsov Kuznetsov
для форварда это не имеет значения, что это дает п...

ты сам написал, что компилятор ворнинг кидает, не знает такого класса/структуры

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
ты сам написал, что компилятор ворнинг кидает, не ...

так делает только мсвц, остальные компиляторы нормально работают

Aleksei Kuznetsov Kuznetsov
так делает только мсвц, остальные компиляторы норм...

ты не должен писать код, который один из 3х компиляторов не собирает (или кидает явный ворнинг), структура и класс - не одно и тоже, какая может быть причина вместо class написать в форварде struct (и наоборот)

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
ты не должен писать код, который один из 3х компил...

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

Aleksei Kuznetsov Kuznetsov
я выше приводил пример. У вас есть фреймворк, кото...

код не твой и беда не твоя, что ломается. Ты никаких законов не нарушаешь, как разработчик фреймворка

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Александр Водянников
Вот и не надо и нельзя так делать.

Не надо что делать? Форварды писать? Менять апи? Тратить время на фикс форвардов, потому что что? Есть костыльное решение для этого это держать свои форварды все в отдельном хедере и поставлять его тоже, но я не вижу большой причины для существования таких костылей. Чем может навредить forward Name; в декларации, вместо class/struct Name;? Ну кроме того что мсвц придется поменять как они манглят имена и сломать аби :D

Aleksei Kuznetsov Kuznetsov
Не надо что делать? Форварды писать? Менять апи? Т...

не надо форварды писать на код, за которым даже не проверяешь при апдейте не изменилось ли там что на этот счёт, это грабли те ещё даже без манглинга если нужны форварды, но самому следить не получается, попроси апстрим фреймворка, чтобы они у себя сделали хедер с форвардами и поддерживали его не нравится, что стандарт допускает разный манглинг для struct и class, напиши пропозал в стандарт, полушай/почитай что тебе там ответят

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Гражданин Котейко
не надо форварды писать на код, за которым даже не...

я и есть апстрим фреймворка и поддерживаю хедер с форвардами и не хочу этого делать

Aleksei Kuznetsov Kuznetsov
я выше приводил пример. У вас есть фреймворк, кото...

А почему кто-то решил, что ломать abi библиотеки и скидывать вину на манглинг – норма? С таким же успехом можно было переименовать классы, сломав код пользователей

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Ofee Oficsu
А почему кто-то решил, что ломать abi библиотеки и...

Потому что поддерживать аби библиотеки которая собирается из сорцов и наружу не торчит не очень нужно. Вы же понимаете что ваше сравнение с именами некорректно?

Aleksei Kuznetsov Kuznetsov
Потому что поддерживать аби библиотеки которая соб...

Ну, если мы заменим abi на api – ничего не поменяется в данном примере Автор библиотеки принял решение сломать api. Жалуемся на компилятор Должны ли эти изменения были ломать api – это уже отдельный вопрос. Но вы уж или принимайте правила всех платформ, которые поддерживаете, или не поддерживайте ту, которая вас не устроила

Ofee Oficsu
Ну, если мы заменим abi на api – ничего не поменяе...

Ну так можно просто не использовать его либу. А если хочется фиксить ее проблемы то использовать

Ofee Oficsu
Ну, если мы заменим abi на api – ничего не поменяе...

Вас же не заставляют насильно ее юзать

Polina 💓
Ну так можно просто не использовать его либу. А ес...

Ну, так и есть. Одно другому не сильно противоречит

Aleksei Kuznetsov-Kuznetsov Автор вопроса

Давайте ни на что не жаловаться и не развиваться! Вы знаете зачем в замангленном имени мсвц использует структ? Для чего это нужно?

Aleksei Kuznetsov Kuznetsov
Давайте ни на что не жаловаться и не развиваться! ...

>> Давайте ни на что не жаловаться Попробуйте пожаловаться на это в их багтрекер. Правда, боюсь, что попытка починить проблему окажется ещё более серьезным ломающим изменением и для api, и для abi всех пользователей платформы

Aleksei Kuznetsov Kuznetsov
Давайте ни на что не жаловаться и не развиваться! ...

сейчас это не важно, оно уже так и менять никто не будет

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

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

читать файл максимально быстро? странный вопрос))
zamtmn
53
Привет. Сразу скажу, что на C/C++/Rust я не пишу, но тем не менее возникла потребность дебага C/C++/Rust кода. Суть: есть серверное приложение, которое периодически ведёт себ...
ninekeem 🐳
4
А чего сейчас в моде вместо Error для эксепшенов? А то я тут внезапно узрел что он не рекомендуется :) У Try::Tiny какой-то совершенно ужасный синтаксис если надо конкретные э...
Denis F
16
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
буквально один оставшийся вопрос при выполнении строчки mov eax, 5 операнд "5" будет присутствовать где-либо в памяти (любой), кроме как в памяти блока .code? подвопрос: как...
12
Всем ку. Подскажите, если задекларировал массив так: int arr[10] = {1, 2, 3, 4}, то в arr[4] будет мусор или нуль?
Sasha K
14
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
я не понимаю mov [r11+8],rcx и прочие. мы записываем значение из rcx, куда?
Bor
15
у меня такой вопрос про память в x86 возник, может кто пояснить?.. у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше)...
Toideng
6
А какие расширения активно используются в промышленности? Именно идейные, по типу гадт, а не всякие оверлоадедстрингс
Степан
11
Карта сайта