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

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
В хедерах си-шных модулей надо вставить скобки Код #ifdef __cplusplus BEGIN_EXTERN_C #endif ... #ifdef __cplusplus END_EXTERN_C #endif , где Код #define BEGIN_EXTERN_C extern "C" { #define END_EXTERN_C } Компилировать и линковать в режиме "плюсов"
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 9 2011, 08:05
|

Местный
  
Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634

|
Цитата(MrYuran @ Jun 9 2011, 12:43)  В хедерах си-шных модулей надо вставить скобки Код #ifdef __cplusplus BEGIN_EXTERN_C #endif ... #ifdef __cplusplus END_EXTERN_C #endif , где Код #define BEGIN_EXTERN_C extern "C" { #define END_EXTERN_C } Компилировать и линковать в режиме "плюсов" Компилится. Только не в хэдерах си-шных модулей, а в хэдере си++ модуля. У меня только так заработало.
|
|
|
|
|
Jun 16 2011, 18:24
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(mdmitry @ Jun 9 2011, 13:47)  Можно ставить с любых заголовочных файлах, которые включаются в проект для с и cpp. в принципе если извратица то можно из сишной программы вызывать с++ модули. у вас проблема в том, что С++ делает такую хрень как name mangling. то есть при линковке имена ваших функций становятся такими что их сишный линкер не может понять. решение которое вам подсказали вверху заставляет линкер не искажать имя функции. но если вы попробуете предложить несколько функций с одинаковым названием-перегруженные, то опять получите ошибку.
|
|
|
|
|
Jun 17 2011, 13:57
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(sergeeff @ Jun 17 2011, 16:20)  Хоть один пример. для С++ NULL не типизирован явно, как в Си, так что приходиться делать так: /* Define NULL pointer value */ #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif
--------------------
Magic Friend
|
|
|
|
|
Jun 17 2011, 13:59
|

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

|
QUOTE (Сергей Борщ @ Jun 17 2011, 16:40)  Область видимости констант, неявное приведение void * к любому указателю в С. Это так, навскидку. Декларация и инициализация стуктур и константных объектов, тип литералов типа 'abcd', объявления типов в sizеof, , функции с переменным количеством аргументов, еще некоторые до сих пор не польззуются прототипами функций  и C а не C99,..... В общем лучше попробовать компильнуть  Вообще-то в С++ стандарте, помнится, было целое приложение посвященное проблемам несовместимости. P.S. Да. Посмотрел - Annex C Compability. Единственно, что там явно не C99. Да и многие 'С' компиляторы будут на некоторые конструкции хоть не ошибки, но warnings выдавать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|