О чем следует помнить при переносе с C на C ++

Asked
Viewd6154

6

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

Примечание. Я прекрасно знаю C ++. Шаблоны, частичная специализация, почему множественное наследование - это плохо (я видел только одно правильное использование для него) и т. Д. Я в основном хочу знать, почему я бы использовал C вместо C ++. DLL и привязки к языку сценариев - одна из причин. Так что мне просто нужно иметь в виду, что для некоторых вещей мне нужен интерфейс C. Есть еще что-нибудь?

9 ответов

0

Да. Код на C кажется более простым для небольших проектов; Локальный и двоичный.

2

Почему множественное наследование - это плохо

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

1

Есть ли вообще причина использовать C?

Хотя это становится все реже, все же можно найти платформы, на которых нет жизнеспособного компилятора C ++. Чип Blackfin от ADI попал в эту категорию несколько лет назад, я не уверен, существует ли сейчас достойный чип.

0

Есть ли вообще причина использовать C?

Код C ++ компилируется слишком медленно для небольших проектов.
Длительная компиляция нарушает цикл: напишите код -> протестируйте -> напишите еще код -> проверьте ...

  • Я лично считаю, что C более элегантно кодировать, но C ++ легче кодировать большие проекты.

    coppro18 ноября 2008, 03:36
  • В настоящее время в большинстве систем компилятор C такой же, как компилятор C ++, поэтому время компиляции идентично.

    Jimmy J15 марта 2009, 01:30
  • @Jimmy J: Возьмите пару проектов с открытым исходным кодом (похожих по размеру), один на чистом C (например, git), другой на C ++ (например, какую-то библиотеку boost) и скомпилируйте их. Убедитесь сами.

    jfs15 марта 2009, 02:30
  • @ Джимми Дж .: Вы так .. ошибаетесь. Я не писал, что компиляторы C ++ компилируют код C медленно. Я писал, что компиляторы C ++ компилируют код C ++ слишком медленно, на мой вкус (по сравнению с кодом C).

    jfs15 марта 2009, 02:27
1

Основной проблемой будут ключевые слова. Использовали ли вы в качестве имен переменных «новые», «частные», «общедоступные» и т. Д.?
Если вы не нацеливаетесь на конкретную встроенную платформу или драйвер режима ядра, нет реальной необходимости ограничивать себя буквой «c».
Вы, конечно же, не получите всех преимуществ C ++, просто написав код C в компиляторе C ++ - для этого потребуется немного больше переосмысления!

17

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

Если у вас есть рабочая библиотека C, и вы хотите, чтобы в ней был интерфейс, более «похожий на C ++», то объединение ее в классы может быть разумнее, чем преобразование. Безусловно, это удовлетворяет требованию предоставления дружественного к DLL интерфейса C: оставьте тот, который у вас уже есть.

5

Вы всегда можете включить необработанный код C в проект C ++. Так что даже если у вас есть библиотека C, которая несколько мешает C ++, просто используйте extern "C" {} для ссылки, а затем вызовите ее в своем коде C ++.

https://isocpp.org/wiki/faq/mixing-c -and-cpp

Также вполне возможно связать объектные файлы C с объектными файлами C ++.

Это (ссылка на C ++ Super-FAQ) - это практически все, что вы знаете, чтобы преобразовать свой проект на C ++ и сохранить его совместимость с устаревшими версиями.

11

Как программист на C, меня раздражает, когда программисты на C ++ пытаются «портировать» C на C ++. Хотя у использования структур языка C ++ есть много преимуществ, они не всегда улучшают простой функционально-ориентированный подход C. Поскольку вы всегда можете получить функциональность C через extern "C", нет особых причин для изменения рабочего кода. В проектах, над которыми я работал, создание объектных оболочек для кода на языке C. Таким образом, основной код может быть разделен между командами, работающими на любом языке, и каждый может использовать интерфейс, соответствующий их среде. Мы даже перенесли некоторый код C ++ на C, чтобы стимулировать повторное использование кода.

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

  • В ваших проектах; хорошо ли сработало создание интерфейсов C для классов C ++? Или их избегали, или никогда не было необходимости в C ++ -> C?

    18 ноября 2008, 05:13
  • Наверное, так же раздражает, как программисты на C ++ находят, когда программисты на C пишут C ++ ;-)

    Steve Jessop17 ноября 2008, 23:24
  • Определите тип непрозрачного указателя для каждого класса. Напишите функцию для каждого метода. Он принимает «self» в качестве параметра, приводит и вызывает метод. Оберните их все во внешнем «C» и скомпилируйте их в библиотеку с помощью компилятора C ++. После этого компоновщик C сможет использовать эту библиотеку. Думаю.

    Steve Jessop21 ноября 2008, 11:11
  • Эй, по крайней мере, он понял, что C и C ++ - разные звери.

    Jimmy J15 марта 2009, 01:32
  • Это означает, что все объекты должны находиться в куче, хотя вы можете что-то сделать с новым размещением. Кроме того, методы, которые принимают дополнительные объекты UDT в качестве параметров, должны приводить эти параметры, как и параметр «self». Я подозреваю, что все, что слишком шаблонно, обречено.

    Steve Jessop21 ноября 2008, 11:16
  • Нам пришлось привнести функциональность C ++ в программы на C, но мы все же стремимся портировать код. В C действительно нет аналогов extern C, поэтому я не знаю, как обернуть классы C ++ для C.

    Jon Ericson20 ноября 2008, 16:31