Использование C ++ API в C? - PullRequest
       47

Использование C ++ API в C?

4 голосов
/ 16 февраля 2011

Однажды я решил начать писать видеоигру на простом старом C.
Это было очень весело, и через три месяца (иногда у меня мало времени уходит с работы), я обнаружил, что мне нужнонекоторый физический движок.
Я решил использовать физический движок Bullet, потому что он кажется одним из лучших для того, что мне нужно.
Затем я обнаружил, что у Bullet на самом деле нет C API, а толькополный C ++ API.Его API C не поддерживается.
После дня ругательства я «преобразовал» свой проект в C ++, что является смелым заявлением о том, что я типизировал все выделения кучи, и я использую new и delete вместо malloc и free, инекоторые определения обернуты в 'extern "C" {...}'.
Некоторые люди, вероятно, стреляли бы в меня из-за этого, но я не видел другого варианта использования таких функций, связанных с производительностью, как этот физический движок, которыйимеет только C ++ API, в C.

Так что теперь я компилирую с g ++, в то же время все еще пишу в основном код "C".Я чувствую себя немного менее счастливым, потому что код больше не чувствует себя чистым.
C ++ выдает мне некоторые странные сообщения об ошибках, в то время как я ничего не имею против языка, который мне часто не нравится парсер g ++.Помимо того, что теперь я могу с радостью перебрасывать объекты друг на друга, некоторые мелочи и чистота моего любимого проекта теперь пустынны.

Мне интересно, правильно ли я поступил.Могу ли я попросить совета, стоит ли продолжать и не беспокоиться об использовании компилятора C ++ для моего «в основном» кода C?Существуют ли другие способы использования этого API в C без каких-либо падений производительности или чрезмерной работы по обслуживанию?

Ответы [ 7 ]

4 голосов
/ 16 февраля 2011

Мне интересно, правильно ли я поступил.

Ну, вам нужен компонент для вашего проекта, и вместо того, чтобы изобретать его снова с нуля, вы повторно использовали существующий кусокпрограммного обеспечения.Это на самом деле звучит правильно для меня.

Могу ли я попросить совета, должен ли я просто продолжить и не беспокоиться об использовании компилятора C ++ для моего "в основном" кода C?

Вам не нужно беспокоиться вообще.C ++ почти на 100% совместим с.Там нет штрафов за это.Вы на самом деле заработали лучшие проверки во время компиляции благодаря гораздо более строгой системе типов.

Существуют ли другие способы использования этого API в C без каких-либо падений производительности или чрезмерной работы по обслуживанию?

Нет, вы не можете использовать API в C без преобразования вашего кода в C ++.Идентификаторы C ++ искажены: это означает, что даже если бы вы были готовы использовать API C ++ из простого C, вы не знали бы, как ссылаться на них.Теоретически это возможно, на практике это не так.

Ваш путь правильный.Удачи в этой игре!

3 голосов
/ 16 февраля 2011

Я думаю, что вы слишком озабочены собой вещами, которые на самом деле не являются проблемами.Вы говорите, что часть чистоты ушла.Ну, я могу это понять.Вы написали это на C, а затем, понимая, что вам нужно использовать C ++, чтобы использовать API по выбору, включили его. Теперь он больше не похож на вашего питомца.Это проблема подсознания, а не программирование.

Я предлагаю вам перекусить (ха-ха) и переписать свой проект на C ++.Тогда он снова станет чистым, вы многому научитесь в пути и не почувствуете, что ваш C-ребенок подвергается гомосексуализму.

2 голосов
/ 16 февраля 2011

В зависимости от того, насколько тесно связаны различные подсистемы вашего двигателя, может быть целесообразно написать разные части двигателя на разных языках.

Например, вы можете выделить физическую часть в модуль C ++, который экспортирует C API и позволяет оставшейся части вашего приложения оставаться в C. Однако, может быть, имеет смысл написать центральную часть системы на C ++ и реорганизовать ваш существующий код C в отдельные модули.

1 голос
/ 16 февраля 2011

Единственные причины, по которым вы хотите сохранить проект как «чистый C», это либо из-за совместимости исходного кода, поддержки инструментов, либо из-за языковых стандартов (MISRA-C и т. Д.).«Я хочу, чтобы это чувствовало себя чистым», вероятно, не очень рациональный аргумент.

Если по таким причинам важно сохранять код как чистый C, вы могли бы написать «обертку» DLL (в предположении Windows) на C ++, которая выполняет всю связь с вашим сторонним API.Конечно, вы получите немало накладных расходов.

Странные сообщения об ошибках, несомненно, вызваны более строгой типизацией в C ++, которая может быть благословением или проклятием в зависимости от ситуации.Компилятор C ++ с большей вероятностью будет шлепать вас по пальцам, когда сталкивается с опасными неявными типами трансляций (целочисленное продвижение и т. Д.), И он, вероятно, будет обеспечивать более строгую «правильность констант».Но в то же время он будет жаловаться на пустые указатели, которые считаются хорошим обобщенным программированием в C, но опасны, небрежны и, возможно, избыточны в C ++.

1 голос
/ 16 февраля 2011

Если вы хотите написать свой проект на C, напишите его на C и создайте обертку C для библиотеки; посмотрите на этот вопрос , чтобы получить советы по этому поводу.

В противном случае переписать свой проект на C ++; но, пожалуйста, не пишите еще один проект C с некоторым C ++ здесь и там, по моему опыту, эти проекты могут быстро превратиться в беспорядок (и если вы пишете код с мышлением C, но вызываете код C ++, странные вещи начинают происходить, когда исключения добавлен в смесь).

1 голос
/ 16 февраля 2011

Не беспокойтесь о написании в основном кода на C и компиляции его на C ++. Просто используйте new / delete вместо malloc / free, и все будет в порядке. Преимущество использования new в том, что вам не нужно приводить результат к правильному типу указателя (неявное приведение из void * к другим указателям запрещено в C ++), и что new никогда не будет возвращать недопустимый указатель. Вы потеряли realloc (), хотя. (И нет, даже не думайте смешивать new / delete с realloc:))

0 голосов
/ 16 февраля 2011

Один из вариантов - преобразовать код C ++ в C, используя LLVM.См. Этот FAQ на веб-сайте проекта: Могу ли я преобразовать код C ++ в код C?

...