С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

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

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

Есть варианты упростить ? - C++ Builder
Для программера ведь важно две вещи быстродействие и размер самой проги. Вот и прошу глянуть где ее и как можно ли урезать. Хочу сразу...

Использование кода символа внутри строки? - C++
Как должна выглядеть стока, содержащая символ с определённым кодом? Можно как то вместо L"начало"+(wchar_t)0xAB+L"конец" набрать всё...

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

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

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

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

40
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.02.2012, 02:19 #2
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
1
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
09.02.2012, 13:01 #3
Переписывать не надо, компилятор g++ схавает как C, так и C++
1
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 17:12 #4
Цитата Сообщение от niXman Посмотреть сообщение
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
достаточно обьектных файлов, если дин. библ-ка не нужна. причем можно использовать уже ранее откомпиленные *.о, но придется написать обертки для нужного функционала и объявить их как extern "C" и использовать их в своем С коде.
1
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
09.02.2012, 20:00  [ТС] #5
Цитата Сообщение от niXman Посмотреть сообщение
собери эти функции в .dll/.so и сделай экспорт в виде Си функций.
Ну с .so понятно, а экспорт как делается? Типа просто использовать их, как если бы они были на С или нужно как-то перегрузить их, чтобы они были похожи на сишные функции? Поясни , если не сложно.
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 20:06 #6
придется писать С-обертки для вашего функционала
разница между тем, что предложил я и niXman лишь в том таскать ли за собой .so или "вмонтировать" некоторую часть в свой исполняемый код
1
Evg
Эксперт CАвтор FAQ
18377 / 6424 / 441
Регистрация: 30.03.2009
Сообщений: 17,832
Записей в блоге: 28
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
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 21:39 #8
Цитата Сообщение от Evg Посмотреть сообщение
грубо говоря, для линковки использовать g++, а не gcc
разве С линковка gcc ... -lstdc++ не подойдет? по моему ничем не отличается от
Цитата Сообщение от Evg Посмотреть сообщение
спасёт онанизм в виде помещения кода в динамическую библиотеку, которую линкуют при помощи компилятора Си++ (и таким образом, у неё пропишутся все необходимые зависимости по динамическим библиотекам).
ведь зависимости все те же. а собирать свою библиотеку оберток не придется
0
Evg
Эксперт CАвтор FAQ
18377 / 6424 / 441
Регистрация: 30.03.2009
Сообщений: 17,832
Записей в блоге: 28
09.02.2012, 21:42 #9
Цитата Сообщение от retmas Посмотреть сообщение
разве С линковка gcc ... -lstdc++ не подойдет?
Это несколько неполное знание некоторых внутренних особенностей работы gcc. Если учесть, что в режиме Си++ в линковку дополнительно подаётся -lm, могут подаваться всякие там -libgcc_eh со всяким паровозом особенностей по части unwind. В итоге получаем сопливую ненадёжную реализацию
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.02.2012, 21:44 #10
Evg, какая автору разница?
фактически это будет с++ программа
функционально - программа с вызовами с++ кода из с
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
09.02.2012, 22:01 #11
Цитата Сообщение от Evg Посмотреть сообщение
в линковку дополнительно подаётся -lm, могут подаваться всякие там -libgcc_eh со всяким паровозом особенностей по части unwind
Evg, об этом я и говорю. ведь по сути нет С или С++ линковки. есть линковка с указанием всех зависимостей. выяснить эти зависимости не сложно. в записи
Цитата Сообщение от retmas Посмотреть сообщение
gcc ... -lstdc++
я и хотел это отразить, просто "сестра таланта" подвела в ясности мысли
0
Evg
Эксперт CАвтор FAQ
18377 / 6424 / 441
Регистрация: 30.03.2009
Сообщений: 17,832
Записей в блоге: 28
09.02.2012, 22:06 #12
Цитата Сообщение от alex_x_x Посмотреть сообщение
фактически это будет с++ программа
функционально - программа с вызовами с++ кода из с
Есть на самом деле разница. Если код на Си++ использует "хорошее" подмножество языка Си++ (т.е. используются только конструкции, не требующие run-time поддержки), то код на Си++ можно рассматривать как код, написанный на ассемблере без использования внешних функций

Цитата Сообщение от retmas Посмотреть сообщение
ведь по сути нет С или С++ линковки. есть линковка с указанием всех зависимостей. выяснить эти зависимости не сложно
А как ты выяснишь? Для вчерашней версии компилятора gcc была одна строка линковки. Для сегодняшней версии gcc - другая. Для завтрашней - третья. Ведь речь здесь идёт о "плохом" подмножестве Си++ (о том, которое требует runt-ime поддержки)
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.02.2012, 22:28 #13
по сути в чем разница между вызовом из с++ си-кода и вызовом из си кода с++?
Полагаю никакой
поэтому думаю правильней всего использовать для с++ с обертками и extern "C" - g++, для си-кода gcc, а линковать g++-ом
1
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 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
18377 / 6424 / 441
Регистрация: 30.03.2009
Сообщений: 17,832
Записей в блоге: 28
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
09.02.2012, 22:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2012, 22:37
Привет! Вот еще темы с ответами:

Определить, какие из этих имен встречаются во всех классах, какие есть хотя бы в двух классах, и какие - только в одном классе - C++
Для каждого из четырех классов указаны имена девочек, обучающихся в них. Определить, какие из этих имен встречаются во всех классах, какие...

Какие действия исполняет заданная часть программы? Если есть ошибки исправить их и объяснить исправления - C++
. . . class Anketa { char *fam; char *name; public: Anketa (); ~ Anketa ( char *str); ...

Какие варианты строительства праников наименее затратны - C++
Задано поле n x m квадратных ячеек, в каждой из которых могут находиться посадки баклажанов. Необходимо построить парники, закрывающие...

есть ли варианты? - C++
кажется продумал технологию движка, который собираюсь делать но вот как оформить его так, чтобы можно было работать с плагинами своего...


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

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

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