Вероятно, лучшее, что нужно сделать, - это установить функции библиотеки C в их поведение перед изменением. но, возможно, у вас нет контроля над этой библиотекой.
Второе, что нужно рассмотреть, - это изменить все случаи, когда вы зависите от функций C lib, возвращающих пустую строку, чтобы использовать функцию-обертку, которая «исправит» указатели NULL:
const char* nullToEmpty( char const* s)
{
return (s ? s : "");
}
Так что теперь
std::string imacppstring = somecstylefunction();
может выглядеть так:
std::string imacppstring( nullToEmpty( somecstylefunction());
Если это недопустимо (это может быть много занятой работы, но это должно быть одноразовое механическое изменение), вы можете реализовать «параллельную» библиотеку, которая имеет те же имена, что и используемая в настоящее время библиотека C lib. с этими функциями просто вызывая оригинальные функции C lib и исправляя NULL-указатели в зависимости от ситуации. Вам нужно поиграть в некоторые хитрые игры с заголовками, компоновщиком и / или пространствами имен C ++, чтобы заставить это работать, и это имеет огромный потенциал, чтобы вызвать путаницу в будущем, поэтому я бы подумал, прежде чем идти по этому пути .
Но что-то вроде следующего может помочь вам начать:
// .h file for a C++ wrapper for the C Lib
namespace clib_fixer {
const char* somecstylefunction();
}
// .cpp file for a C++ wrapper for the C Lib
namespace clib_fixer {
const char* somecstylefunction() {
const char* p = ::somecstylefunction();
return (p ? p : "");
}
}
Теперь вам просто нужно добавить этот заголовок в файлы .cpp, которые в данный момент вызывают функции C lib (и, возможно, удалить заголовок для C lib) и добавить
using namespace clib_fixer;
в файл .cpp с использованием этих функций.
Это может быть не слишком плохо. Может быть.