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

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

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

32 ответов

53 просмотра

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

вроде как в стандарте есть, что 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
Давайте ни на что не жаловаться и не развиваться! ...

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

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта