Очень маловероятно, что это упражнение будет достигнуто. Хороший код C уже более модульный, чем C++, как правило, может быть - использование указателей на структуры позволяет единицам компиляции быть независимым в том же виде, что и pImpl на C++ - в C вам не нужно выставлять данные внутри структуры, чтобы выставить его интерфейс. Так что, если вы включите каждую функцию C
// Foo.h
typedef struct Foo_s Foo;
int foo_wizz (const Foo* foo, ...);
в класс C++ с
// Foo.hxx
class Foo {
// struct Foo members copied from Foo.c
int wizz (...) const;
};
вы свели модульность системы по сравнению с кодом C - каждый клиент Foo Теперь нужно восстанавливать, если какой-либо частные функции реализации или переменные-члены добавляются к типу Foo.
Существует много вещей, которые классы на C++ дают вам, но модульность не является одним из них.
Спросите своего начальника, какие цели бизнеса достигнуты этим упражнением.
Примечание по терминологии:
модуль в системе является компонентом с хорошо определенным интерфейсом, который может быть заменен другим модулем с тем же интерфейсом, не оказывая влияния на остальную часть системы. Система, состоящая из таких модулей, является модульной.
Для обоих языков интерфейс к модулю является условным заголовочным файлом. Рассмотрим string.h
и string
как определение интерфейсов для простых модулей обработки строк в C и C++. Если в реализации string.h имеется ошибка, то устанавливается новая libc.so. Этот новый модуль имеет тот же интерфейс, и все, что динамически связано с ним, сразу же получает выгоду от новой реализации. И наоборот, если есть ошибка в обработке строк в std::string
, то каждый проект, который его использует, необходимо перестроить.C++ вводит очень большое количество связей в системы, которые язык ничего не делает для смягчения - на самом деле, лучшее использование C++, полностью использующее его функции, часто намного более тесно связано, чем эквивалентный C-код.
Если вы попытаетесь сделать C++ модульным, вы, как правило, получите что-то вроде COM, где каждый объект должен иметь как интерфейс (чистый виртуальный базовый класс), так и реализацию, и вы подставляете косвенность для эффективного генерируемого шаблона код.
Если вы не заботитесь о том, состоит ли ваша система из сменных модулей, вам не нужно выполнять действия, чтобы сделать ее модульной, и можете использовать некоторые из функций C++, такие как классы и шаблоны, которые , подходящий для применения, может улучшить сцепление в модуле. Если ваш проект должен создать единое статически связанное приложение, то у вас нет модульной системы, и вы можете позволить себе не заботиться о модульности. Если вы хотите создать что-то вроде anti-grain geometry, что является прекрасным примером использования шаблонов для объединения разных алгоритмов и структур данных, тогда вам нужно сделать это на C++ - довольно хорошо, что ничто иное не было столь же мощным.
Так что будьте очень осторожны, что ваш менеджер означает «модульный».
Если каждый файл уже имеет «свою собственную цель и функцию» и «каждая отдельная функция в программе передается указателем на одну из структур», то единственной разницей в ее изменении в классы было бы заменить указатель к структуре с неявным указателем this
. Это не повлияет на то, насколько модульная система является фактически (если структура определена только в файле C, а не в заголовке), это уменьшит модульность.
+1 Это большой коллективный вздох, который вы только что слышали, это многие пользователи SO, которые работают с устаревшим кодом ... –
Либо реорганизуйте его в хорошо структурированный C, либо перепишите его на идиоматическом языке C++. Попытка заставить плохо C на какой-то гибридный язык даст вам проблемы с совместимостью на обоих языках и некоторые из преимуществ. –
Я бы определенно поговорил с вашим начальником о переписывании некоторой программы –