little_greg Опубликовано 31 марта, 2011 Жалоба Поделиться Опубликовано 31 марта, 2011 объясните назначение extern "C", желательно с примером Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 2 апреля, 2011 Жалоба Поделиться Опубликовано 2 апреля, 2011 (изменено) Насколько я знаю, Это если вы хотите включить C код в вашей C++ программе (или если делаете программу, и некоторые функции будут использованными другим программ (типа у вас будут некоторые dll которые можно использовать из других программ) Изменено 2 апреля, 2011 пользователем Darhazer Ссылка на комментарий Поделиться на другие сайты Поделиться
little_greg Опубликовано 3 апреля, 2011 Автор Жалоба Поделиться Опубликовано 3 апреля, 2011 спасибо, но я не очень понял насчет "включить код С в С++ программе", что это значит? Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 3 апреля, 2011 Жалоба Поделиться Опубликовано 3 апреля, 2011 Когда пишете C++, можно пользуват C или asm - как для оптимизации, так и потому что есть системние библиотеки, написани на C Например если делаете графический редактор, можете пользуват функции для обработке изображения написание на C, или написать их на C чтоб работали бистрее. Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 3 апреля, 2011 Жалоба Поделиться Опубликовано 3 апреля, 2011 читайте здесь 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" ф-ии не могут быть перегружены. Так понятно? =) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Dann Опубликовано 3 апреля, 2011 Жалоба Поделиться Опубликовано 3 апреля, 2011 И еще можно почитать про связывание с программами на других языках. Если ты что-то обрамляешь extern "C", то это служит указанием компилятору "С++" создавать "C" код. При компиляции к именам функций не будут добавляться дополнительные символы. Ссылка на комментарий Поделиться на другие сайты Поделиться
little_greg Опубликовано 4 апреля, 2011 Автор Жалоба Поделиться Опубликовано 4 апреля, 2011 (изменено) всем спасибо, теперь все стало понятно. Изменено 4 апреля, 2011 пользователем little_greg Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения