我想要一个类似于
/*In header*/
void foo(FILE *outpt=stdout);
/*In implementation*/
void foo(FILE *outpt)
{
if(outpt) fprintf(outpt, "Hello!");
}但是如果NULL==stdout的话,这段代码(很明显)就坏了。(编辑: Jonathan指出这段代码已经坏了,因为C没有默认参数。我的C++正在展示,但这个想法依然存在。)
C指定stdin、stdout和stderr是实现定义的FILE*常量,但我找不到指示这些常量不是NULL的引用。而且,我找不到任何暗示NULL可能不是一个有效的打开文件的东西!
在MSVS中,fprintf(NULL, "Hello!")调用abort(),这表明NULL确实是一个无效的FILE*规范。
在这方面,C++似乎遵循了C。我最终是一个C++程序员,但我将接受一个C答案,因为它可能会转移到C++,以实现向后兼容性。因此:NULL做C或C++规范(包括C2x和C++20),以保证是无效的
发布于 2020-09-27 04:34:53
C11 7.21.1/3描述了标准文件句柄:
宏是…。
stderrstdinstdout它们是“指向FILE的指针”类型的表达式,它们分别指向与标准错误、输入和输出流相关联的FILE对象。
如果这些对象的值为null,则它们不会指向任何这样的对象。
发布于 2020-09-27 04:10:20
NULL不是有效的文件*!由于stdout和stdin与任何其他流一样,下面应用…
https://man7.org/linux/man-pages/man3/fopen.3.html
成功完成后返回值-- fopen()、fdopen()和freopen() --返回一个文件指针。否则,返回NULL,并将errno设置为指示错误。
https://stackoverflow.com/questions/64084675
复制相似问题