Предположим, что у меня есть приложение, написанное на C, которое должно анализировать некоторые данные blob. Процесс синтаксического анализа выполняется целой специальной библиотекой (у меня есть доступ к этому библиотечному коду). Поскольку этот BLOB-объект имеет версии, мне нужно поддерживать, скажем, две его версии одновременно. Рабочий процесс выглядит примерно так:
- 'v1' отсутствует -> библиотека поддерживает 'v1'
- 'v2' отсутствует -> библиотека теперь поддерживает 'v2' и 'v1'
- 'v3' отсутствует -> библиотека теперь поддерживает 'v3' и 'v2'
и т. Д.
Основная проблема заключается в том, что большинство символы в библиотеке для 'v2', например, также присутствуют в библиотеке 'v1' с тем же прототипом функции.
Первой мыслью было использовать что-то вроде пространств имен в C ++, чтобы иметь что-то вроде:
/app/src/lib_v1/parser.c
void _parse_blob(char* blob){ //data parsing code for v1}
/////////////////////////////
/app/src/lib_v2/parser.c
void _parse_blob(char* blob){ //data parsing code for v2}
////////////////////////////
/app/src/main.c
//Pseudo-code
char* data;
if(_check_version(data) == 'v1')
parser.v1._parse_blob(data);
else
parser.v2._parse_blob(data);
Но я не знаю, можно ли добиться чего-то подобного в C без изменения чего-либо в коде «исходящей» библиотеки (v1 в данном случае), поскольку весь этот код уже был протестирован, и его изменение сделало бы недействительными все тесты выпуска.
Другая идея заключалась бы в том, чтобы разделить код обеих библиотек на две динамические c связанные библиотеки и загружать / выгружать их при необходимости, но не Я не знаю, может ли это сработать или эффективно.
Что бы Как лучше всего подойти к этой проблеме?