Я использую библиотеку C в моем проекте C++. Для ведения журнала библиотека C требует, чтобы я определил указатель FILE для получения журналов, т.е.:
extern "C"
{
FILE *pFileStdErr = stderr;
}
Это приведет к появлению журналов в окне консоли.
Однако я действительно хочу, чтобы захватить журналы из библиотеки C в моем методе класса C++, т.е.
extern "C"
{
FILE *pFileStdErr = ???;
}
void CMyClass::Log (std::string error)
{
m_myLogger.LogError(error);
}
Итак, как мне "склеить" это вместе?
В GNU есть нестандартное расширение: fopencookie()
. При этом вы можете определить поведение FILE
самостоятельно.
Даже если вы не находитесь в GNU, ваша среда может обеспечить что-то вроде этого.
Но имейте в виду, что вы теряете переносимость, если вы это сделаете.
Вы можете создать канал с функцией pipe (_pipe on windows), а затем использовать fdopen для возвращаемых дескрипторов, чтобы получить указатель FILE *. Затем вы можете установить конец записи в качестве указателя FILE * для своей библиотеки и прочитать из прочитанного конца канала в своем классе.
pFileStdErr
проходило через вашCMyClass::Log
??pFileStdErr
, вам нужно изменить любой класс, кm_myLogger
принадлежитm_myLogger
. Если вы хотите, чтобы ваши журналы C переходили в ваш класс C ++, вам не повезло.