对于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