C 在参数中使用perror

C 在参数中使用perror,c,C,将参数传递给peror()是常见的,还是通常用于非常通用的消息。例如,类似于: char buffer[50]; sprintf(buffer, "The file %s could not be opened", filename); perror(buffer); perror("The file %s could not be opened", filename); 我问这个问题的原因是因为似乎peror的单个arg必须是字符串文字(没有任何格式

将参数传递给
peror()
是常见的,还是通常用于非常通用的消息。例如,类似于:

char buffer[50];
sprintf(buffer, "The file %s could not be opened", filename);
perror(buffer);
perror("The file %s could not be opened", filename);
我问这个问题的原因是因为似乎
peror
的单个arg必须是字符串文字(没有任何格式说明符),因此可能不鼓励使用任何变量

或者,有没有一种简单的方法来做这样的事情:

char buffer[50];
sprintf(buffer, "The file %s could not be opened", filename);
perror(buffer);
perror("The file %s could not be opened", filename);

(可能是宏?

peror
声明为:

void perror(const char *s);
从手册页:

首先(如果s不为NULL且*s不是NULL字节('\0')),将打印参数字符串s,后跟冒号和空格。然后是一条与当前errno值相对应的错误消息和一条新行

由此,我们可以假设
peror
基本上定义为:

fprintf(stderr, "%s: %s\n", s, strerror(errno));
作为一个宏,它可以实现为:

#define MY_PERROR(FMT,...) \
  fprintf(stderr, FMT ": %s\n", ##__VA_ARGS__, strerror(errno))
根据您的示例,用法如下:

MY_PERROR("The file %s could not be opened", filename);
输出如下所示:

无法打开文件:

您可以使用:

#include <string.h> /* for strerror()    */
#include <errno.h>  /* for errno         */
#include <stdlib.h> /* for EXIT_FAILURE  */
#include <fcntl.h>  /* open and O_RDONLY */

...

    if ((fd = open(file, O_RDONLY)) < 0) {
        fprintf(stderr, "open: %s: %s (errno = %d)\n",
                filename,
                strerror(errno),
                errno);
        exit(EXIT_FAILURE);
    }
#包括/*用于strerror()*/
#包括/*用于错误号*/
#包括/*用于出口故障*/
#仅包括/*打开和打开*/
...
如果((fd=open(file,orduonly))<0){
fprintf(标准,“打开:%s:%s(错误号=%d)\n”,
文件名,
斯特雷罗(埃尔诺),
埃尔诺);
退出(退出失败);
}

您可以自由使用任何您喜欢的参数。

一种选择:
int en=errno;fprintf(stderr,“无法打开文件%s:%s\n”,文件名,strerror(en))
@kaylum C中是否有全局变量或带有“last error”的东西,或者
perror
如何知道打印什么?是的,这是@David542手册页上说的“头文件定义了整数变量errno,它是由系统调用和一些库函数在发生错误时设置的,以指示出错的地方。”因此,是的,我认为它是一个全局变量。@David542“将当前存储在系统变量errno中的错误代码的文本描述打印到stderr。”。必须确保生成传递给
peror
的字符串所做的任何操作都不会修改
errno
,否则将显示错误消息。特别是,
sprintf
可能会潜在地改变
errno
,因此您必须加倍小心。