2016-11-18 30 views
1

我知道,这两个可以作为错误信息的工作,perror和fprintf与stderr有什么区别?

perror(" "); 
fprintf(stderr, " "); 

但什么是真正的它们之间的差异?各自的优点/缺点是什么?

+0

这只是你不能将格式参数传递给'perror'。所以它稍快... –

+0

'perror(“foo”)'基本上等于'fprintf(stderr,“foo:%s \ n”,strerror(errno))''。我喜欢使用'fprintf(stderr,“foo:%s。\ n”,strerror(errno))',但仅仅是因为'perror()'输出末尾没有'.'会导致我错误。请记住,如果遇到* fatal *错误,例如'malloc()'失败,或者程序无法打开所需的文件,则需要*报告错误并使用exit退出程序(EXIT_FAILURE);'或'abort();'。 –

回答

4

the perror() standard

的PERROR()函数将映射通过 符号errno为语言相关的错误消息,访问的错误编号,其将被 写入标准错误流如下:

  • 首先(如果s是不是一个空指针和字符指向s不是空字节),该字符串指向秒,然后一个 <结肠>和<空间>。

  • 然后出现错误消息字符串,然后是<换行符>。

错误消息的字符串的内容应是相同 由字符串错误()返回的带有参数的errno。

所以,

perror(" "); 

会发出类似

: invalid argument 

stderr,取决于errno当前值。

fprintf(stderr, " "); 

将仅发射空格字符stderr,而不是打印当前errno值的字符串表示。

fprintf(stderr, " ");孤立是很无用的。 perror(" ");将提供有关当前值errno的数据。

+0

因此,使用perror验证函数返回值将永远是好的做法,perror会自动发送到stderr而不传递任何参数 –

+0

@jorgesaraiva一般来说,是的,因为这会给你一些指示*为什么*失败。 –