Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Рекомендуемые сообщения

Насколько я знаю, Это если вы хотите включить C код в вашей C++ программе (или если делаете программу, и некоторые функции будут использованными другим программ (типа у вас будут некоторые dll которые можно использовать из других программ)

Изменено пользователем Darhazer
Ссылка на комментарий
Поделиться на другие сайты

Когда пишете C++, можно пользуват C или asm - как для оптимизации, так и потому что есть системние библиотеки, написани на C

Например если делаете графический редактор, можете пользуват функции для обработке изображения написание на C, или написать их на C чтоб работали бистрее.

Ссылка на комментарий
Поделиться на другие сайты

читайте здесь http://alex-siew.livejournal.com/2489.html

А также:

если до сих пор непонятно откуда растут корни, поясняю полностью.

издревле повелось, что компиляторы с "продвинутых" и общеупотребительных языков программирования (asm, c, c++ и др.) разделяют код между т.н. юнитами компиляции (модулями). Каждый модуль может быть скомпилирован отдельно от других, производя на свет файл *.obj формата (универсальный формат), которые потом с помощью линкера подшиваются в один конечный исполняемых файл *.exe.

Так уж повелось, что в целях унификации фирмы-производители компиляторов старались сохранить формат *.obj единым для всех языков (по возможности), что даёт хорошую возможность создавать программы на из юнитов на разных языках программирования. Например модуль на чистопородном ASM можно было сшить в программу на чистопородном C.

Обратная совместимость с этой концепцией ввела в язык C++ некие "странные" на первый взгляд вещи.

*.obj файл исторически устроен сравнительно просто: в нём есть изолированные блоки откомпилированного уже машинного кода и данных, которые сдобрены "метками" - мнемоническими обозначениями, указывающими куда-нибудь внутрь сего дела. Причем в *.obj файле принципиально неизместно чем именно является метка - адресом глобальной переменной, или ф-ии - даже для линкера это непринципиально.

Со старыми языками всё это работало без проблем - экспортные ф-ии и переменные получали совпадающую со своим программным именем метку в *.obj файле и дальше всё шло как по маслу.

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

И вот чтобы эту концепцию протянуть через *.obj файлы без конфликта меток пришлось ввести т.н. name mangling. С помощью этого механизма имена переменных и ф-ий в *.obj файлах дополняются специальными длинными абреввиатурами, чтобы исключить конфликт имен конечных перегруженных ф-ий.

Проблема в том, что этот механизм срабатывает всегда и объявив void some(); ты в *.obj файле получить можешь имя для ф-ии вроде _some_v_f. Чтобы нормально спрягать код на C++ с C или ASM, где name mangling отсутствует, введено extern "C", которое отключает сей механизм у экспортируемых или импортируемых имен переменных/ф-ий. Логично, что extern "C" ф-ии не могут быть перегружены.

Так понятно? =)

  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

И еще можно почитать про связывание с программами на других языках.

Если ты что-то обрамляешь extern "C", то это служит указанием компилятору "С++" создавать "C" код. При компиляции к именам функций не будут добавляться дополнительные символы.

Ссылка на комментарий
Поделиться на другие сайты

всем спасибо, теперь все стало понятно.

Изменено пользователем little_greg
Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...