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
,因此您必须加倍小心。