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

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

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

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

+24
12 апр. '12 в 16:42
источник поделиться
2 ответа

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

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

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

+19
12 апр. '12 в 16:49
источник

Связанные вопросы


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

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

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

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

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

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

+15
12 апр. '12 в 17:03
источник

Посмотрите другие вопросы по меткам или Задайте вопрос