在windows平台上,在c代码中将stderr临时重定向为null



对于windows平台,我需要等效的指针,有指针吗?这就是我为*nix平台所遵循的,到目前为止,它似乎正在发挥作用。链接可以在这里找到

作为一种更具扩展性的替代方案,请考虑声明一个变量(您可以称之为error_stream?),该变量有时设置为stderr,有时设置为其他文件(例如Windows NT上的fopen(NUL_DEVICE_FILENAME, "wb");)。

这个代码的一个很好的方面是,您可以更改NUL_DEVICE_FILENAME(甚至整个函数)以适合每个操作系统;函数变成了一个接口,使不那么可移植行为更容易移植。请参阅test.c(靠近本文底部)了解用法示例,以及下面的输出,以证明它有效。祝你好运…:)

error_stream.h:

#ifndef INCLUDE_ERROR_STREAM
#define INCLUDE_ERROR_STREAM
#include <stdio.h>
FILE  *get_error_stream(void);
void   set_error_stream(FILE *);
void reset_error_stream(void);
void blank_error_stream(void);
#endif

error_stream.c:

#include "error_stream.h"
#define NUL_DEVICE_FILENAME "NUL" /* This worked fine for me on Win10 */
                                  /* Try "\Device\Null", "NUL" and  *
                                   *  ... "NUL:" if it doesn't work,  *
                                   *  ... or obviously "/dev/null" on *
                                   *  ... *nix                        */
FILE *error_stream, *blank_stream;
FILE *get_error_stream(void) {
    if (!error_stream) {
        error_stream = stderr;
    }
    return error_stream;
}
void set_error_stream(FILE *f) {
    error_stream = f;
}
void reset_error_stream(void) {
    set_error_stream(stderr);
}
void blank_error_stream(void) {
    if (!blank_stream) {
        blank_stream = fopen(NUL_DEVICE_FILENAME, "wb+");
    }
    set_error_stream(blank_stream);
}

test.c:

#include "error_stream.h"
int main(void) {
    fputs("Testingn", get_error_stream());
    blank_error_stream();
    fputs("Testingn", get_error_stream());
    reset_error_stream();
    fputs("Onen", get_error_stream());
    blank_error_stream();
    fputs("Twon", get_error_stream());
    reset_error_stream();
}

C:UsersSebDesktop>gcc -c error_stream.c -o error_stream.o
C:UsersSebDesktop>gcc test.c error_stream.o -o test.exe
C:UsersSebDesktop>test
Testing
One

相关内容

  • 没有找到相关文章

最新更新