C 函数err_sys()在哪里定义?
我收到一个与此代码中的C 函数err_sys()在哪里定义?,c,network-programming,C,Network Programming,我收到一个与此代码中的err\u sys()相关的错误: #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> int main() { int sockfd; if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) err_sys("can't create socket"); close(so
err\u sys()
相关的错误:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
int sockfd;
if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
err_sys("can't create socket");
close(sockfd);
return 0;
}
函数err_sys()在哪里定义?您必须指定包含此函数实现的lib文件。
这是编译c代码时常见的问题。请将此项放在代码顶部:
void err_sys(const char* x)
{
perror(x);
exit(1);
}
perror在stdio.h中定义
err_sys在Richard Stevens的《UNIX网络编程:套接字网络API》一书中使用。据我所知,这并不常见
编辑:修复了代码错误这是来自TCP/IP的吗?我记得看到过这一点,附录中给出了定义:
#include <errno.h>
#include <stdarg.h>
/*
* Print a message and return to caller.
* Caller specifies "errnoflag".
*/
static void
err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
char buf[MAXLINE];
vsnprintf(buf, MAXLINE, fmt, ap);
if (errnoflag)
snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
strerror(error));
strcat(buf, "\n");
fflush(stdout); /* in case stdout and stderr are the same */
fputs(buf, stderr);
fflush(NULL); /* flushes all stdio output streams */
}
/*
* Fatal error related to a system call.
* Print a message and terminate.
*/
void
err_sys(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(1, errno, fmt, ap);
va_end(ap);
exit(1);
}
#包括
#包括
/*
*打印一条消息并返回给呼叫者。
*调用者指定“errnoflag”。
*/
静态空隙
err_doit(int errnoflag,int error,const char*fmt,va_list ap)
{
char buf[MAXLINE];
vsnprintf(buf、MAXLINE、fmt、ap);
if(errnoflag)
snprintf(buf+strlen(buf),MAXLINE strlen(buf),“:%s”,
strerror(error));
strcat(buf,“\n”);
fflush(stdout);/*如果stdout和stderr相同*/
FPUT(buf、stderr);
fflush(NULL);/*刷新所有stdio输出流*/
}
/*
*与系统调用相关的致命错误。
*打印消息并终止。
*/
无效的
错误系统(常量字符*fmt,…)
{
va_列表ap;
va_启动(ap、fmt);
err_doit(1,errno,fmt,ap);
va_端(ap);
出口(1);
}
err_sys()
是W.Richard Stevens在几本书中使用的函数。此函数用于打印发生的错误类型
该函数用于带有自定义头文件“ourhdr.h”(或其他文件)的文本中的程序。请查看附录中的标题列表或函数定义。此函数的源代码(来自W.Richard Stevens在UNIX®环境中的高级编程)可以在本书的网站上找到:。下载本书的源代码文件夹,您可以在:
打开源代码文件夹并选择lib文件夹。接下来打开名为error.c的文件。您将找到其中定义的sys_err()。正如其他人所说,此代码类似于Stevens的示例:Unix网络编程。如果您有这本书,请在附录D:杂项源代码中查找教科书定义(以及示例中普遍使用的unp.h标题)。这个文件太多了,无法在SO答案中输入,但是在互联网上快速搜索史蒂文斯的“标准错误函数”会返回很多google books的结果和实现。从来没有听说过
err\u sys
(所以我不知道getsockopt.cpp
是如何编译的)。改用perror
或strerror
。另外,你真的需要开始接受以前的一些答案。这并不难@托马拉克:它之所以能够编译,可能是因为警告显示得不够高,而且C标准允许您不为函数声明原型。@Oli:ORLY?我不使用C,所以我不知道。太可怕了!(这提醒了我……我当然是指上面的getsockopt.c
)@Tomalak:的确!形势严峻。例如,请参见此处接受的答案:。当您使用没有实现的函数时,这种情况尤其常见,因为它不存在。为什么不为此使用函数,而不是宏?编写的宏有严重的错误,例如,if(foo)err_sys(x);否则…
将失败。如果无法编写正确的宏,请使用函数!要将其编写为宏,您需要#define err_sys(x)do{perror(x);exit(1);}while(0)
。这不会与if(foo)err_sys(x)相冲突;否则…问题。它(do{…},而(0)
)是一种标准技术。
#include <errno.h>
#include <stdarg.h>
/*
* Print a message and return to caller.
* Caller specifies "errnoflag".
*/
static void
err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
char buf[MAXLINE];
vsnprintf(buf, MAXLINE, fmt, ap);
if (errnoflag)
snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
strerror(error));
strcat(buf, "\n");
fflush(stdout); /* in case stdout and stderr are the same */
fputs(buf, stderr);
fflush(NULL); /* flushes all stdio output streams */
}
/*
* Fatal error related to a system call.
* Print a message and terminate.
*/
void
err_sys(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(1, errno, fmt, ap);
va_end(ap);
exit(1);
}