Подтвердить что ты не робот

Почему имя, которое не стандартизировано

Мне просто интересно, почему название mangling никогда не было стандартизировано стандартом С++. Очевидно, что разные алгоритмы изменения имен повреждают интероперабельность [1], и я не вижу никакого преимущества в определении его реализации.

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

[1] все те люди, которые экспортируют функции как extern "C", говорят по томам.

4b9b3361

Ответ 1

В стандарте не рассматриваются детали реализации. Здесь очень много, многие вещи, которые зависят от реализации, и которые предотвращают программы совместной работы: как выкладываются классы, структура vtable и т.д. В общем случае компиляторы изменят если они меняют любой из них. Это преднамеренно, поскольку это предотвращает код, который не будет работать при связывании.

Возможно, чтобы определенная платформа определяла С++ ABI; все компиляторы которые придерживаются этого, будут использовать совместимые реализации и обычное название. Это проблема для поставщиков платформ, Однако; по каким-то причинам очень немногие поставщики определили С++ ABI.

И причина extern "C" заключается в том, что почти все платформы определяют C ABI.

Ответ 2

Стандарт фактически не требует изменения имени. В этом случае Стандарт не требует чисел с плавающей запятой IEEE, или целых чисел с двумя дополнениями или любого количества других вещей.

До тех пор, пока не было широко распространенного ABI, на которое он мог положиться, GCC фактически отказался от использования другой схемы переключения имен, чем ее конкуренты:

g++ не обрабатывает имя так же, как другие компиляторы С++. Это означает, что объектные файлы, скомпилированные с одним компилятором, не могут использоваться с другим.

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

Название mangling также более сложное, чем многие программисты понимают. Например, как бы стандарт указывал приемлемые соглашения о вызовах для всех платформ, на которых С++ мог работать? Должна ли система RISC поддерживать x86 stdcall, хотя системы RISC обычно передают свои аргументы в регистрах, а не в стеке?