Записать загрузчик в C или C++?

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

А-ч, мне жаль, что переменные не были , константа по умолчанию и изменяемый требовалась для переменных неконстанты:)

17
задан waffleman 9 November 2009 в 15:47
поделиться

10 ответов

Это непростой вопрос. Это зависит от ряда факторов, в том числе:

  • Как вы предпочитаете компоновку кода.
  • Есть ли компилятор C ++, доступный для вашей цели (и любых других целей, на которых вы, возможно, захотите использовать загрузчик).
  • Насколько важен размер кода для вашего приложения (мы говорим о дополнительных 10%, а не о мегабайтах, как предлагается в другом ответе).

Лично мне очень нравятся классы как способ размещения моего кода. Даже при написании кода C я стараюсь хранить все в модульных файлах со статическими функциями файловой области, "имитирующими" функции-члены, и (несколько) статическими переменными области видимости файлов для "имитации" переменных-членов. Сказав это, большинство моих существующих встраиваемых проектов (все относительно небольших масштабов, до 128 КБ флэш-памяти, включая загрузчик, но обычно меньше), как правило, были написаны на C. Теперь, когда у меня есть компилятор C ++, я определенно подумываю о переходе на C ++.

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

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

26
ответ дан 30 November 2019 в 10:04
поделиться

Если вам не нужно использовать объектную ориентацию, используйте C. Простой выбор. Это проще и легче, при этом выполняя ту же задачу.

Некоторые стойкие не согласятся, но объектно-ориентированный подход делает C ++> C, и наоборот во многих обстоятельствах.

11
ответ дан 30 November 2019 в 10:04
поделиться

Я бы использовал C, если нет особой причины использовать C ++. Для загрузчика вам действительно не понадобится объектно-ориентированный объект.

Используйте простейший инструмент, который выполнит эту работу.

10
ответ дан 30 November 2019 в 10:04
поделиться

Используйте C с µClibc ]. Это упростит ваш код и уменьшит занимаемую им площадь. Можно найти на: www.uclibc.org .

1
ответ дан 30 November 2019 в 10:04
поделиться

Для такой конкретной задачи, как загрузчик, я бы определенно не использовал C ++. Я думаю, что стандартная библиотека C ++ занимает как минимум пару МБ, а не то, что вам нужно в загрузчике. Перейти с C.

0
ответ дан 30 November 2019 в 10:04
поделиться

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

3
ответ дан 30 November 2019 в 10:04
поделиться

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

12
ответ дан 30 November 2019 в 10:04
поделиться

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

7
ответ дан 30 November 2019 в 10:04
поделиться

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

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

4
ответ дан 30 November 2019 в 10:04
поделиться

Перейдите на C ++ и определите, какие языковые функции вам нужны. У вас по-прежнему есть полный контроль над кодом объекта вывода, если вы понимаете используемые вами абстракции C ++.

Использование объектно-ориентированного программирования все еще может работать хорошо, если вы избегаете использования виртуальных функций. Избегайте неизменяемых типов объектов, которые требуют большого количества копирования для передачи значений, например std :: string. Но вы по-прежнему можете использовать такие функции, как шаблоны, без какого-либо реального влияния на производительность во время выполнения.

1
ответ дан 30 November 2019 в 10:04
поделиться