Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.90/30: Рейтинг темы: голосов - 30, средняя оценка - 4.90
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
1

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

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

Есть программа на C++, и в ней кое-какие нужные функции, которые хотелось бы использовать в программе на C. Переписывать заново функции с С++ на С не хочется, какие есть альтернативные пути решения?
С точки зрения дизайна кода звучит это довольно дико, обычно всё наоборот. Может, есть какие-то флаги для линкера, чтобы он мог слинковать две единицы трансляции как надо?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2012, 00:57
Ответы с готовыми решениями:

Замена Visual Studio 2015: подскажите, какие есть варианты
В общем, нужно скомпилировать проект который написан под VS2015. Скомпилить нужно в винде (32 и...

Использование кода символа внутри строки?
Как должна выглядеть стока, содержащая символ с определённым кодом? Можно как то вместо...

Подскажите какие платные есть варианты для встроенного редактора кода?
Необходимо в свое приложение включить редактор кода. Нашел пока два варианта:...

Какие есть способы вычисления регистра EIP внутри программы?
Подскажите пожалуйста какие есть способы вычисления регистра EIP внутри программы, кроме такого:...

40
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.02.2012, 02:19 2
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
1
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
09.02.2012, 13:01 3
Переписывать не надо, компилятор g++ схавает как C, так и C++
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 17:12 4
Цитата Сообщение от niXman Посмотреть сообщение
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
достаточно обьектных файлов, если дин. библ-ка не нужна. причем можно использовать уже ранее откомпиленные *.о, но придется написать обертки для нужного функционала и объявить их как extern "C" и использовать их в своем С коде.
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
09.02.2012, 20:00  [ТС] 5
Цитата Сообщение от niXman Посмотреть сообщение
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
Ну с .so понятно, а экспорт как делается? Типа просто использовать их, как если бы они были на С или нужно как-то перегрузить их, чтобы они были похожи на сишные функции? Поясни , если не сложно.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 20:06 6
придется писать С-обертки для вашего функционала
разница между тем, что предложил я и niXman лишь в том таскать ли за собой .so или "вмонтировать" некоторую часть в свой исполняемый код
1
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
09.02.2012, 21:21 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)

В юниксах в этом случае действительно спасёт онанизм в виде помещения кода в динамическую библиотеку, которую линкуют при помощи компилятора Си++ (и таким образом, у неё пропишутся все необходимые зависимости по динамическим библиотекам). Как в этом случае дело обстоит под виндой - я не знаю
2
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 21:39 8
Цитата Сообщение от Evg Посмотреть сообщение
грубо говоря, для линковки использовать g++, а не gcc
разве С линковка gcc ... -lstdc++ не подойдет? по моему ничем не отличается от
Цитата Сообщение от Evg Посмотреть сообщение
спасёт онанизм в виде помещения кода в динамическую библиотеку, которую линкуют при помощи компилятора Си++ (и таким образом, у неё пропишутся все необходимые зависимости по динамическим библиотекам).
ведь зависимости все те же. а собирать свою библиотеку оберток не придется
0
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
09.02.2012, 21:42 9
Цитата Сообщение от retmas Посмотреть сообщение
разве С линковка gcc ... -lstdc++ не подойдет?
Это несколько неполное знание некоторых внутренних особенностей работы gcc. Если учесть, что в режиме Си++ в линковку дополнительно подаётся -lm, могут подаваться всякие там -libgcc_eh со всяким паровозом особенностей по части unwind. В итоге получаем сопливую ненадёжную реализацию
1
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
09.02.2012, 21:44 10
Evg, какая автору разница?
фактически это будет с++ программа
функционально - программа с вызовами с++ кода из с
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 22:01 11
Цитата Сообщение от Evg Посмотреть сообщение
в линковку дополнительно подаётся -lm, могут подаваться всякие там -libgcc_eh со всяким паровозом особенностей по части unwind
Evg, об этом я и говорю. ведь по сути нет С или С++ линковки. есть линковка с указанием всех зависимостей. выяснить эти зависимости не сложно. в записи
Цитата Сообщение от retmas Посмотреть сообщение
gcc ... -lstdc++
я и хотел это отразить, просто "сестра таланта" подвела в ясности мысли
0
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
09.02.2012, 22:06 12
Цитата Сообщение от alex_x_x Посмотреть сообщение
фактически это будет с++ программа
функционально - программа с вызовами с++ кода из с
Есть на самом деле разница. Если код на Си++ использует "хорошее" подмножество языка Си++ (т.е. используются только конструкции, не требующие run-time поддержки), то код на Си++ можно рассматривать как код, написанный на ассемблере без использования внешних функций

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

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

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

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

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

Код
$ gcc c-code.c -c
$ g++ cpp-code.cpp -c
$ g++ c-code.o cpp-code.o -o a.out
2
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
09.02.2012, 23:41 18
и я тоже
Цитата Сообщение от kravam Посмотреть сообщение
Переписывать не надо, компилятор g++ схавает как C, так и C++
1
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2012, 00:35 19
Цитата Сообщение от kravam Посмотреть сообщение
Переписывать не надо, компилятор g++ схавает как C, так и C++
вы переоцениваете с++
0
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
10.02.2012, 09:45 20
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от kravam Посмотреть сообщение
Переписывать не надо, компилятор g++ схавает как C, так и C++
Попробуй скомпили этот пример на Си и на Си++

C
1
2
3
4
int new (int class, int throw)
{
  return class + throw;
}
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2012, 09:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

скажите какие есть программы для построения блок схем из кода???
скажите какие есть программы для построения блок схем из кода???

Посоветуйте, какие есть варианты
Нужно организовать автоматический обмен данными справочника "Сотрудники" между Бухгалтерией и ЗУП....

Какие варианты кода не вызовут ошибку компиляции?
Какие варианты кода не вызовут ошибку компиляции? Вариант 1 class Parent...

Какие есть варианты в Environment.Exit()?
Возможно глупый вопрос, но какие есть коды в Environment.Exit(код)? Что они делают? Пример я знаю...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.