Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.74
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Использование C++ кода внутри программы на C: какие есть варианты? - C++

09.02.2012, 00:57. Просмотров 4308. Ответов 40
Метки нет (Все метки)

Есть программа на C++, и в ней кое-какие нужные функции, которые хотелось бы использовать в программе на C. Переписывать заново функции с С++ на С не хочется, какие есть альтернативные пути решения?
С точки зрения дизайна кода звучит это довольно дико, обычно всё наоборот. Может, есть какие-то флаги для линкера, чтобы он мог слинковать две единицы трансляции как надо?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2012, 00:57     Использование C++ кода внутри программы на C: какие есть варианты?
Посмотрите здесь:

C++ Может есть варианты по проще??
C++ Builder Есть варианты упростить ?
C++ Какие есть способы или алгоритмы написания программы для нахождения обратной матрицы
Определить, какие из этих имен встречаются во всех классах, какие есть хотя бы в двух классах, и какие - только в одном классе C++
Возможно ли как-то в Visual Studio 2010 проверять есть ли утечки памяти? Может есть какие-то специальные плагины для этого? C++
C++ Программы с использование функций. Наведите пожалуйста какие-то маленькие примеры
С++ Программа ,Функции , Варианты написание программы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.02.2012, 02:19     Использование C++ кода внутри программы на C: какие есть варианты? #2
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
09.02.2012, 13:01     Использование C++ кода внутри программы на C: какие есть варианты? #3
Переписывать не надо, компилятор g++ схавает как C, так и C++
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
09.02.2012, 17:12     Использование C++ кода внутри программы на C: какие есть варианты? #4
Цитата Сообщение от niXman Посмотреть сообщение
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
достаточно обьектных файлов, если дин. библ-ка не нужна. причем можно использовать уже ранее откомпиленные *.о, но придется написать обертки для нужного функционала и объявить их как extern "C" и использовать их в своем С коде.
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
09.02.2012, 20:00  [ТС]     Использование C++ кода внутри программы на C: какие есть варианты? #5
Цитата Сообщение от niXman Посмотреть сообщение
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
Ну с .so понятно, а экспорт как делается? Типа просто использовать их, как если бы они были на С или нужно как-то перегрузить их, чтобы они были похожи на сишные функции? Поясни , если не сложно.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
09.02.2012, 20:06     Использование C++ кода внутри программы на C: какие есть варианты? #6
придется писать С-обертки для вашего функционала
разница между тем, что предложил я и niXman лишь в том таскать ли за собой .so или "вмонтировать" некоторую часть в свой исполняемый код
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
09.02.2012, 21:21     Использование C++ кода внутри программы на C: какие есть варианты? #7
Цитата Сообщение от retmas Посмотреть сообщение
придется писать С-обертки для вашего функционала
+1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int func (int x, int y)
{
  // типа твоя функция на Си++
  // в символьной таблице имя функции манглируется, а потому нет надёжных
  // переносимых способов вызвать непосредственно данную функцию из кода на Си
}
 
// А эта функция объявлена как extern "C" - оно предназначено для использования
// совместно с Си-кодами
extern "C" int c_func (int x, int y)
{
  return func (x, y);
}
А вот так к ней обращаться из функции на Си:

C
1
2
3
4
extern int c_func (int x, int y);
...
c_func (1, 2);
...
Понятно, что таким способом метод класса вызвать нельзя

Добавлено через 4 минуты
При этом надо понимать, что если, к примеру, твоя Си++'ная функция использовала конструкции, требующие run-time поддержки (например, new, std::cout, throw), то в режиме чистого Си с таким кодом ты слинковаться не сможешь - у тебя не будет хватать библиотеки поддержки Си++.Т.е. линковать придётся в режиме Си++ (грубо говоря, для линковки использовать g++, а не gcc)

В юниксах в этом случае действительно спасёт онанизм в виде помещения кода в динамическую библиотеку, которую линкуют при помощи компилятора Си++ (и таким образом, у неё пропишутся все необходимые зависимости по динамическим библиотекам). Как в этом случае дело обстоит под виндой - я не знаю
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
09.02.2012, 21:39     Использование C++ кода внутри программы на C: какие есть варианты? #8
Цитата Сообщение от Evg Посмотреть сообщение
грубо говоря, для линковки использовать g++, а не gcc
разве С линковка gcc ... -lstdc++ не подойдет? по моему ничем не отличается от
Цитата Сообщение от Evg Посмотреть сообщение
спасёт онанизм в виде помещения кода в динамическую библиотеку, которую линкуют при помощи компилятора Си++ (и таким образом, у неё пропишутся все необходимые зависимости по динамическим библиотекам).
ведь зависимости все те же. а собирать свою библиотеку оберток не придется
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
09.02.2012, 21:42     Использование C++ кода внутри программы на C: какие есть варианты? #9
Цитата Сообщение от retmas Посмотреть сообщение
разве С линковка gcc ... -lstdc++ не подойдет?
Это несколько неполное знание некоторых внутренних особенностей работы gcc. Если учесть, что в режиме Си++ в линковку дополнительно подаётся -lm, могут подаваться всякие там -libgcc_eh со всяким паровозом особенностей по части unwind. В итоге получаем сопливую ненадёжную реализацию
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.02.2012, 21:44     Использование C++ кода внутри программы на C: какие есть варианты? #10
Evg, какая автору разница?
фактически это будет с++ программа
функционально - программа с вызовами с++ кода из с
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
09.02.2012, 22:01     Использование C++ кода внутри программы на C: какие есть варианты? #11
Цитата Сообщение от Evg Посмотреть сообщение
в линковку дополнительно подаётся -lm, могут подаваться всякие там -libgcc_eh со всяким паровозом особенностей по части unwind
Evg, об этом я и говорю. ведь по сути нет С или С++ линковки. есть линковка с указанием всех зависимостей. выяснить эти зависимости не сложно. в записи
Цитата Сообщение от retmas Посмотреть сообщение
gcc ... -lstdc++
я и хотел это отразить, просто "сестра таланта" подвела в ясности мысли
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
09.02.2012, 22:06     Использование C++ кода внутри программы на C: какие есть варианты? #12
Цитата Сообщение от alex_x_x Посмотреть сообщение
фактически это будет с++ программа
функционально - программа с вызовами с++ кода из с
Есть на самом деле разница. Если код на Си++ использует "хорошее" подмножество языка Си++ (т.е. используются только конструкции, не требующие run-time поддержки), то код на Си++ можно рассматривать как код, написанный на ассемблере без использования внешних функций

Цитата Сообщение от retmas Посмотреть сообщение
ведь по сути нет С или С++ линковки. есть линковка с указанием всех зависимостей. выяснить эти зависимости не сложно
А как ты выяснишь? Для вчерашней версии компилятора gcc была одна строка линковки. Для сегодняшней версии gcc - другая. Для завтрашней - третья. Ведь речь здесь идёт о "плохом" подмножестве Си++ (о том, которое требует runt-ime поддержки)
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.02.2012, 22:28     Использование C++ кода внутри программы на C: какие есть варианты? #13
по сути в чем разница между вызовом из с++ си-кода и вызовом из си кода с++?
Полагаю никакой
поэтому думаю правильней всего использовать для с++ с обертками и extern "C" - g++, для си-кода gcc, а линковать g++-ом
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
09.02.2012, 22:33     Использование C++ кода внутри программы на C: какие есть варианты? #14
Evg, в общем случае соглашусь. но могут быть вполне конкретные случаи, где gcc ... -lstdc++ будет приемлимым. и полностью отказываться от этой возможности - неразумно

Добавлено через 2 минуты
Цитата Сообщение от alex_x_x Посмотреть сообщение
поэтому думаю правильней всего использовать для с++ с обертками и extern "C" - g++, для си-кода gcc, а линковать g++-ом
согласен. и не нужно будет таскать динамические библиотеки из оберток
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
09.02.2012, 22:37     Использование C++ кода внутри программы на C: какие есть варианты? #15
Цитата Сообщение от alex_x_x Посмотреть сообщение
по сути в чем разница между вызовом из с++ си-кода и вызовом из си кода с++?
Полагаю никакой
С точки зрения построения вызова и линковки - никакой.

Цитата Сообщение от alex_x_x Посмотреть сообщение
поэтому думаю правильней всего использовать для с++ с обертками и extern "C" - g++, для си-кода gcc, а линковать g++-ом
Ну вот этот момент меня немного и пугает. Если есть возможность линковать g++'ом, то нафига вообще извращаться и писать код на си, который лезет в код на Си++

Цитата Сообщение от retmas Посмотреть сообщение
но могут быть вполне конкретные случаи, где gcc ... -lstdc++ будет приемлимым
Если у тебя на машине установлена libstdc++, значит установлен и сам g++. А зачем запускать "gcc -lstdc++", если можно запустить "g++"? Да и вообще у автора хотелось бы выяснить, нафига это извращение нужно
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
09.02.2012, 23:02  [ТС]     Использование C++ кода внутри программы на C: какие есть варианты? #16
Цитата Сообщение от Evg Посмотреть сообщение
С точки зрения построения вызова и линковки - никакой.

Ну вот этот момент меня немного и пугает. Если есть возможность линковать g++'ом, то нафига вообще извращаться и писать код на си, который лезет в код на Си++
В данном конкретном случае как раз нельзя, так как автор кода на Си по ходу намеренно дал названия переменным типа "new", а там несколько тысяч строк кода ( точнее три всего, но всё равно как-то не улыбается переделывать, так как там кроме этого ещё специфичные вещи для Си
Цитата Сообщение от Evg Посмотреть сообщение
Да и вообще у автора хотелось бы выяснить, нафига это извращение нужно
Я просто хотел сделать без особых затрат времени что-то типа карты пользователей DHT-сети, навроде карты мира, чтобы отображались хосты в виде точек разного цвета, в зависимости от адреса и ответа. Ну и были у меня кое-какие наработки по графике, на С++. Естественно, неохота переписывать, время поджимает, мне нужно делать презентацию о сети Kademlia, и я хотел выйти из положения с минимальными затратами времени
Ну а чтобы залезть во внутренний интерфейс DHT и в зависимости от пинга рисовать точки на экране, придётся пихать свои костыли в функции на Си (особенности реализации, т.к. обход хостов - это довольно низкий уровень).
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
09.02.2012, 23:08     Использование C++ кода внутри программы на C: какие есть варианты? #17
Понятно. Т.е. ситуация такая, что есть большой кусок кода на Си и большой кусок кода на Си++ и просто нужно их объединить. Тогда делай так, как я писал в посте #7:

Код
$ gcc c-code.c -c
$ g++ cpp-code.cpp -c
$ g++ c-code.o cpp-code.o -o a.out
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
09.02.2012, 23:41     Использование C++ кода внутри программы на C: какие есть варианты? #18
и я тоже
Цитата Сообщение от kravam Посмотреть сообщение
Переписывать не надо, компилятор g++ схавает как C, так и C++
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2012, 00:35     Использование C++ кода внутри программы на C: какие есть варианты? #19
Цитата Сообщение от kravam Посмотреть сообщение
Переписывать не надо, компилятор g++ схавает как C, так и C++
вы переоцениваете с++
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2012, 09:45     Использование C++ кода внутри программы на C: какие есть варианты?
Еще ссылки по теме:

C++ есть ли варианты?
Какие есть хитрости и трюки, уменьшающие размер кода и увеличивающие быстродействие C++
Использование кода символа внутри строки? C++
Какие действия исполняет заданная часть программы? Если есть ошибки исправить их и объяснить исправления C++
Какие варианты строительства праников наименее затратны C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,415
Записей в блоге: 26
10.02.2012, 09:45     Использование C++ кода внутри программы на C: какие есть варианты? #20
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от kravam Посмотреть сообщение
Переписывать не надо, компилятор g++ схавает как C, так и C++
Попробуй скомпили этот пример на Си и на Си++

C
1
2
3
4
int new (int class, int throw)
{
  return class + throw;
}
Yandex
Объявления
10.02.2012, 09:45     Использование C++ кода внутри программы на C: какие есть варианты?
Ответ Создать тему
Опции темы

Текущее время: 06:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru