Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c+中实现文件指针+; 我在C++项目中使用C库。对于日志记录,C库要求我定义一个文件指针来获取日志,即: extern "C" { FILE *pFileStdErr = stderr; }_C++_C - Fatal编程技术网

在c+中实现文件指针+; 我在C++项目中使用C库。对于日志记录,C库要求我定义一个文件指针来获取日志,即: extern "C" { FILE *pFileStdErr = stderr; }

在c+中实现文件指针+; 我在C++项目中使用C库。对于日志记录,C库要求我定义一个文件指针来获取日志,即: extern "C" { FILE *pFileStdErr = stderr; },c++,c,C++,C,这将使日志显示在控制台窗口中 但是,我真正想要的是从C++类方法中的C库中获取日志,即 extern "C" { FILE *pFileStdErr = ???; } void CMyClass::Log (std::string error) { m_myLogger.LogError(error); } 那么如何将其“粘合”在一起呢?您可以使用该函数(在windows上)创建一个管道,然后使用返回的描述符获取文件*指针。然后可以将管道的写入端设置为库的FILE*指针,并从

这将使日志显示在控制台窗口中

但是,我真正想要的是从C++类方法中的C库中获取日志,即

extern "C"
{
    FILE *pFileStdErr = ???;
}

void CMyClass::Log (std::string error)
{
    m_myLogger.LogError(error);
}

那么如何将其“粘合”在一起呢?

您可以使用该函数(在windows上)创建一个管道,然后使用返回的描述符获取文件*指针。然后可以将管道的写入端设置为库的FILE*指针,并从类中管道的读取端读取

GNU上有一个非标准扩展:
fopencookie()
。这样,您就可以自己定义
文件的行为了

即使您不在GNU上,您的环境也可能提供类似的功能


但请注意,如果这样做,您将失去便携性。

好的,我承认这一点。我读了好几遍,仍然在努力理解你的问题。你想神奇地有任何东西写入<代码> pFILSTEDRR< <代码>浏览你的<代码> CMyClass::日志< /代码>成员???如果你想让C++日志转到<代码> pFielestDrr < /代码>,你需要修改任何类<代码> MyMyLogg/<代码>。如果你想把C日志转到C++类,那就不走运了。是的,我不想把消息直接指向STDUT,而是用C++类来处理它们。调用<代码> SoCoOpIs<代码>,然后<代码> FDOPEN//COD> SOCKEION的一端,并把它交给库。在另一端,在主循环中读取并将输入传递给日志方法。如果C函数尝试写入多个管道缓冲区值的日志(可能只有4K字节),它将死锁。你需要读入一个单独的线程并缓冲无限的数据。如果你走单独的线程路线,在设计与主线程的同步时需要非常小心,或者准备处理部分和无序的日志消息。如果出现问题,他们可以在windows或AIO*nix上使用重叠IO以避免死锁。C库使用文件*,这就是问题的根源。如果你能改变它,你只需要把它变成一个回调到你的C++库中,实际上我可以做到这一点,从它看来,这就是我要做的。我想知道是否有一种“神奇”的方法我可能忽略了…谢谢。