реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Совместное использование *.сpp файлов и *.c, Не компилируются совместно файлы Си и Си++
sergeeff
сообщение Jun 18 2011, 13:51
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(sonycman @ Jun 18 2011, 12:38) *
А наоборот может быть - ошибка при вызове из си++ файла функции, объявленной в простом си исходнике?

Ошибка такая же - Li005 - линкер не может найти определение функции... sad.gif


Вы хоть эту ветку читаете? Про extern "C"?
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 19 2011, 17:36
Сообщение #17


Любитель
*****

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



Цитата(sergeeff @ Jun 18 2011, 17:51) *
Вы хоть эту ветку читаете? Про extern "C"?

А вы хоть читаете, о чём я спрашиваю?
Одно дело, когда обычный си модуль не может найти си++ функцию, имя которой, по понятным причинам, видоизменено.
Но когда наоборот - си++ модуль в упор не видит обычную си функцию?

В этом случае ведь name mangling не работает?

Ошибка уходит, когда принудительно включаю компиляцию си файлов в режиме си++.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 19 2011, 18:04
Сообщение #18


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sonycman @ Jun 19 2011, 23:36) *
Но когда наоборот - си++ модуль в упор не видит обычную си функцию?

Именно для этого случая и нужно в заголовочных файлах от си функций писать extern "C". Иначе C++ ожидает функции с замангленными именами.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 19 2011, 19:14
Сообщение #19


Любитель
*****

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



Цитата(AHTOXA @ Jun 19 2011, 22:04) *
Именно для этого случая и нужно в заголовочных файлах от си функций писать extern "C". Иначе C++ ожидает функции с замангленными именами.

Понятно. Значит, всегда, когда плюсы имееют дело с ассемблерными или обычными сишными модулями (или наоборот) необходимо юзать этот костыль.
Спасибо beer.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 19 2011, 20:30
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(sonycman @ Jun 19 2011, 22:14) *
Понятно. Значит, всегда, когда плюсы имееют дело с ассемблерными или обычными сишными модулями (или наоборот) необходимо юзать этот костыль.
Спасибо beer.gif


А это вовсе не костыль, а возможность из С++ использовать С/ASM модули. Вам эта возможность не нравится?

Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 19 2011, 21:17
Сообщение #21


Любитель
*****

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



Цитата(sergeeff @ Jun 20 2011, 00:30) *
А это вовсе не костыль, а возможность из С++ использовать С/ASM модули. Вам эта возможность не нравится?

Я об этом знал, но считал, что это работает только в сторону от си++ к си.
Не думал, что плюсы будут манглить даже обычную сишную функцию, подключенную через хидер laughing.gif
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 20 2011, 02:59
Сообщение #22


Adept
******

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



Цитата(sonycman @ Jun 20 2011, 04:17) *
Я об этом знал, но считал, что это работает только в сторону от си++ к си.
Не думал, что плюсы будут манглить даже обычную сишную функцию, подключенную через хидер laughing.gif

Если компиляете в С++ режиме, то все функции будут кодироваться по-плюсатому. Ведь в плюсах обычное дело та же перегрузка имён функций, и как компилятор должен догадаться, какие функции у вас имеют С-связывание, а какие С++ связывание. Для этого и введена спецификация связывания extern "<Lang>", где <Lang> - отличный от С++ язык (там не обязательно должен быть С, хотя этот вариант встречается в подавляющем большинстве случаев).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
XVR
сообщение Jun 20 2011, 08:42
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(sonycman @ Jun 20 2011, 01:17) *
Не думал, что плюсы будут манглить даже обычную сишную функцию, подключенную через хидер laughing.gif
А откуда С++ знать, что это 'обычная С функция'? Для этого extern "C" и предназначен rolleyes.gif
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 20 2011, 09:13
Сообщение #24


Любитель
*****

Группа: Свой
Сообщений: 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" и предназначен rolleyes.gif

Так тело-то этой функции - в обычном .c файле!
Компилер что, манглит сразу имя функции по её объявлению в хидере, не заглядывая даже в определение?
Вот шустрый какой! biggrin.gif
Go to the top of the page
 
+Quote Post
XVR
сообщение Jun 20 2011, 09:21
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(sonycman @ Jun 20 2011, 13:13) *
Так тело-то этой функции - в обычном .c файле!
А как компилятор в процессе компиляции файла А узнает о теле функции в файле Б? Он же их отдельно компилирует
Цитата
Компилер что, манглит сразу имя функции по её объявлению в хидере, не заглядывая даже в определение?
Разумеется. Тело функции его не интересует (его вообще может не быть)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 20 2011, 09:34
Сообщение #26


Любитель
*****

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



Цитата(XVR @ Jun 20 2011, 13:21) *
Разумеется. Тело функции его не интересует (его вообще может не быть)

Понятно, теперь буду знать. Спасибо! rolleyes.gif
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 20 2011, 12:04
Сообщение #27


Adept
******

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



Цитата(sonycman @ Jun 20 2011, 16:13) *
Интересно, а какие ещё есть идентификаторы <Lang>?

Мне попадалось FORTRAN.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 20 2011, 12:15
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (dxp @ Jun 20 2011, 14:04) *
Мне попадалось FORTRAN.

И PASCAL



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
inventor
сообщение Jun 22 2011, 10:52
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Кстати, никогда не делайте программы для DSP и контроллеров на С++
выгоды которые вы получите весят меньше чем недостатки и косяки
которые вы встретите и не сможете устранить.
То есть делайте свои программы исключительно на C
а не С++.
Безо всяких "extern C"/
Все таки язык С++ был разработан совсем для других целей.
Ну там базы данных писать и что-то подобное большое.
В качестве системного языка он не подходит.
По моему скромному мнению.
Хотя находятся герои которые для QNX что-то на С++ ваяют.

Сообщение отредактировал inventor - Jun 22 2011, 10:53
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 22 2011, 12:13
Сообщение #30


Adept
******

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



Цитата(inventor @ Jun 22 2011, 17:52) *
Кстати, никогда не делайте программы для DSP и контроллеров на С++

sm.gif
Вам сюда.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01506 секунд с 7
ELECTRONIX ©2004-2016