|
|
  |
Совместное использование *.сpp файлов и *.c, Не компилируются совместно файлы Си и Си++ |
|
|
|
Jun 19 2011, 17:36
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(sergeeff @ Jun 18 2011, 17:51)  Вы хоть эту ветку читаете? Про extern "C"? А вы хоть читаете, о чём я спрашиваю? Одно дело, когда обычный си модуль не может найти си++ функцию, имя которой, по понятным причинам, видоизменено. Но когда наоборот - си++ модуль в упор не видит обычную си функцию? В этом случае ведь name mangling не работает? Ошибка уходит, когда принудительно включаю компиляцию си файлов в режиме си++.
|
|
|
|
|
Jun 20 2011, 02:59
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(sonycman @ Jun 20 2011, 04:17)  Я об этом знал, но считал, что это работает только в сторону от си++ к си. Не думал, что плюсы будут манглить даже обычную сишную функцию, подключенную через хидер  Если компиляете в С++ режиме, то все функции будут кодироваться по-плюсатому. Ведь в плюсах обычное дело та же перегрузка имён функций, и как компилятор должен догадаться, какие функции у вас имеют С-связывание, а какие С++ связывание. Для этого и введена спецификация связывания extern "<Lang>", где <Lang> - отличный от С++ язык (там не обязательно должен быть С, хотя этот вариант встречается в подавляющем большинстве случаев).
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jun 20 2011, 09:13
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(dxp @ Jun 20 2011, 06:59)  Если компиляете в С++ режиме, то все функции будут кодироваться по-плюсатому. Ведь в плюсах обычное дело та же перегрузка имён функций, и как компилятор должен догадаться, какие функции у вас имеют С-связывание, а какие С++ связывание. Для этого и введена спецификация связывания extern "<Lang>", где <Lang> - отличный от С++ язык (там не обязательно должен быть С, хотя этот вариант встречается в подавляющем большинстве случаев). Спасибо. Интересно, а какие ещё есть идентификаторы <Lang>? Цитата(XVR @ Jun 20 2011, 12:42)  А откуда С++ знать, что это 'обычная С функция'? Для этого extern "C" и предназначен  Так тело-то этой функции - в обычном .c файле! Компилер что, манглит сразу имя функции по её объявлению в хидере, не заглядывая даже в определение? Вот шустрый какой!
|
|
|
|
|
Jun 20 2011, 09:21
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(sonycman @ Jun 20 2011, 13:13)  Так тело-то этой функции - в обычном .c файле! А как компилятор в процессе компиляции файла А узнает о теле функции в файле Б? Он же их отдельно компилирует Цитата Компилер что, манглит сразу имя функции по её объявлению в хидере, не заглядывая даже в определение? Разумеется. Тело функции его не интересует (его вообще может не быть)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|