freopen (3) - это C-ориентированное решение (а не C ++, как задан вопрос), и только удача заставляет его работать. Не указано работать. Это работает только потому, что когда файловый дескриптор 2 закрыт и / dev / null открыт, он получает файловый дескриптор 2. В многопоточной среде это может не сработать. Вы также не можете гарантировать, что реализация freopen (3) сначала закроет данный поток перед открытием нового файла. Все это предполагает, что вы не можете предполагать, что libxml2 использует stdio в стиле C.
Решением POSIX для этого является использование open (2) и dup2 (2):
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
...
/* error checking elided for brevity */
int fd = ::open("/dev/null", O_WRONLY);
::dup2(fd, 2);
::close(fd);