Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
#pragma
Временно недоступен
955 / 226 / 14
Регистрация: 12.04.2009
Сообщений: 921
#1

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

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

Есть программа на C++, и в ней кое-какие нужные функции, которые хотелось бы использовать в программе на C. Переписывать заново функции с С++ на С не хочется, какие есть альтернативные пути решения?
С точки зрения дизайна кода звучит это довольно дико, обычно всё наоборот. Может, есть какие-то флаги для линкера, чтобы он мог слинковать две единицы трансляции как надо?

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

0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2012, 00:57
Ответы с готовыми решениями:

Есть варианты упростить ?
Для программера ведь важно две вещи быстродействие и размер самой проги. Вот и...

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

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

Написать все доступные варианты организации циклов (возврата программы к определённой строке кода)
Здравствуйте! Напишите, пожалуйста, ВСЕ доступные (ну если их 3-5, если же...

Вставка кода внутри программы
Здравствуйте! У меня следующий вопрос: можно ли внутри кода программы в любом...

40
niXman
Эксперт С++
3202 / 1451 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.02.2012, 02:19 #2
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
1
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
09.02.2012, 13:01 #3
Переписывать не надо, компилятор g++ схавает как C, так и C++
1
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 17:12 #4
Цитата Сообщение от niXman Посмотреть сообщение
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
достаточно обьектных файлов, если дин. библ-ка не нужна. причем можно использовать уже ранее откомпиленные *.о, но придется написать обертки для нужного функционала и объявить их как extern "C" и использовать их в своем С коде.
1
#pragma
Временно недоступен
955 / 226 / 14
Регистрация: 12.04.2009
Сообщений: 921
09.02.2012, 20:00  [ТС] #5
Цитата Сообщение от niXman Посмотреть сообщение
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
Ну с .so понятно, а экспорт как делается? Типа просто использовать их, как если бы они были на С или нужно как-то перегрузить их, чтобы они были похожи на сишные функции? Поясни , если не сложно.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 20:06 #6
придется писать С-обертки для вашего функционала
разница между тем, что предложил я и niXman лишь в том таскать ли за собой .so или "вмонтировать" некоторую часть в свой исполняемый код
1
Evg
Эксперт CАвтор FAQ
19124 / 6965 / 522
Регистрация: 30.03.2009
Сообщений: 19,608
Записей в блоге: 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
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 21:39 #8
Цитата Сообщение от Evg Посмотреть сообщение
грубо говоря, для линковки использовать g++, а не gcc
разве С линковка gcc ... -lstdc++ не подойдет? по моему ничем не отличается от
Цитата Сообщение от Evg Посмотреть сообщение
спасёт онанизм в виде помещения кода в динамическую библиотеку, которую линкуют при помощи компилятора Си++ (и таким образом, у неё пропишутся все необходимые зависимости по динамическим библиотекам).
ведь зависимости все те же. а собирать свою библиотеку оберток не придется
0
Evg
Эксперт CАвтор FAQ
19124 / 6965 / 522
Регистрация: 30.03.2009
Сообщений: 19,608
Записей в блоге: 30
09.02.2012, 21:42 #9
Цитата Сообщение от retmas Посмотреть сообщение
разве С линковка gcc ... -lstdc++ не подойдет?
Это несколько неполное знание некоторых внутренних особенностей работы gcc. Если учесть, что в режиме Си++ в линковку дополнительно подаётся -lm, могут подаваться всякие там -libgcc_eh со всяким паровозом особенностей по части unwind. В итоге получаем сопливую ненадёжную реализацию
1
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
09.02.2012, 21:44 #10
Evg, какая автору разница?
фактически это будет с++ программа
функционально - программа с вызовами с++ кода из с
0
retmas
Жарю без масла
865 / 747 / 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
19124 / 6965 / 522
Регистрация: 30.03.2009
Сообщений: 19,608
Записей в блоге: 30
09.02.2012, 22:06 #12
Цитата Сообщение от alex_x_x Посмотреть сообщение
фактически это будет с++ программа
функционально - программа с вызовами с++ кода из с
Есть на самом деле разница. Если код на Си++ использует "хорошее" подмножество языка Си++ (т.е. используются только конструкции, не требующие run-time поддержки), то код на Си++ можно рассматривать как код, написанный на ассемблере без использования внешних функций

Цитата Сообщение от retmas Посмотреть сообщение
ведь по сути нет С или С++ линковки. есть линковка с указанием всех зависимостей. выяснить эти зависимости не сложно
А как ты выяснишь? Для вчерашней версии компилятора gcc была одна строка линковки. Для сегодняшней версии gcc - другая. Для завтрашней - третья. Ведь речь здесь идёт о "плохом" подмножестве Си++ (о том, которое требует runt-ime поддержки)
1
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
09.02.2012, 22:28 #13
по сути в чем разница между вызовом из с++ си-кода и вызовом из си кода с++?
Полагаю никакой
поэтому думаю правильней всего использовать для с++ с обертками и extern "C" - g++, для си-кода gcc, а линковать g++-ом
1
retmas
Жарю без масла
865 / 747 / 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
19124 / 6965 / 522
Регистрация: 30.03.2009
Сообщений: 19,608
Записей в блоге: 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
#pragma
Временно недоступен
955 / 226 / 14
Регистрация: 12.04.2009
Сообщений: 921
09.02.2012, 23:02  [ТС] #16
Цитата Сообщение от Evg Посмотреть сообщение
С точки зрения построения вызова и линковки - никакой.

Ну вот этот момент меня немного и пугает. Если есть возможность линковать g++'ом, то нафига вообще извращаться и писать код на си, который лезет в код на Си++
В данном конкретном случае как раз нельзя, так как автор кода на Си по ходу намеренно дал названия переменным типа "new", а там несколько тысяч строк кода ( точнее три всего, но всё равно как-то не улыбается переделывать, так как там кроме этого ещё специфичные вещи для Си
Цитата Сообщение от Evg Посмотреть сообщение
Да и вообще у автора хотелось бы выяснить, нафига это извращение нужно
Я просто хотел сделать без особых затрат времени что-то типа карты пользователей DHT-сети, навроде карты мира, чтобы отображались хосты в виде точек разного цвета, в зависимости от адреса и ответа. Ну и были у меня кое-какие наработки по графике, на С++. Естественно, неохота переписывать, время поджимает, мне нужно делать презентацию о сети Kademlia, и я хотел выйти из положения с минимальными затратами времени
Ну а чтобы залезть во внутренний интерфейс DHT и в зависимости от пинга рисовать точки на экране, придётся пихать свои костыли в функции на Си (особенности реализации, т.к. обход хостов - это довольно низкий уровень).
0
Evg
Эксперт CАвтор FAQ
19124 / 6965 / 522
Регистрация: 30.03.2009
Сообщений: 19,608
Записей в блоге: 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
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
09.02.2012, 23:41 #18
и я тоже
Цитата Сообщение от kravam Посмотреть сообщение
Переписывать не надо, компилятор g++ схавает как C, так и C++
1
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
10.02.2012, 00:35 #19
Цитата Сообщение от kravam Посмотреть сообщение
Переписывать не надо, компилятор g++ схавает как C, так и C++
вы переоцениваете с++
0
Evg
Эксперт CАвтор FAQ
19124 / 6965 / 522
Регистрация: 30.03.2009
Сообщений: 19,608
Записей в блоге: 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
10.02.2012, 09:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2012, 09:45

Какие есть хитрости и трюки, уменьшающие размер кода и увеличивающие быстродействие
скажите какие есть хитрости и трюки в языкe c++ уменьшающие размер кода и...

Программы с использование функций. Наведите пожалуйста какие-то маленькие примеры
Я в С++ новичок . Вот дошла до функций , но не могу понять , как именно они...

Какие есть способы или алгоритмы написания программы для нахождения обратной матрицы
Подскажите, пожалуйста, какие есть способы или алгоритмы написания программы...


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

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

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