以下のソースコードで、'va_start' used in function with fixed args
と出てしまい、どうしたらいいのか分かりません。
書き方が古いそうなのですが、どう書き直せばよろしいでしょうか?
va_start(args, va_alist);
void lprintf(va_alist)
の引数を指定すればいいと思ったのですが、できませんでした。
C言語に詳しい方、よろしくお願いします。
// エラー内容 daemon.c:89:2: error: 'va_start' used in function with fixed args va_start(args, va_alist); ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.5/include/stdarg.h:17:29: note: expanded from macro 'va_start' #define va_start(ap, param) __builtin_va_start(ap, param) ^ 1 error generated.
// daemon.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <syslog.h> //#include <varargs.h> #include <stdarg.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include "daemon.h" #define MAXFD 64 static int IsDaemon=0; void InitDaemon(char *ident,int chdir_root,int all_fd_close) { int i,fd; pid_t pid; if((pid=fork())!=0){ exit(0); } setsid(); signal(SIGHUP,SIG_IGN); if((pid=fork())!=0){ exit(0); } IsDaemon=1; if(chdir_root){ chdir("/"); } if(all_fd_close){ for(i=0;i<MAXFD;i++){ close(i); } if((fd=open("/dev/null",O_RDWR,0))!=-1) { (void)dup2(fd,0); (void)dup2(fd,1); (void)dup2(fd,2); if(fd>2){ (void)close(fd); } } } openlog(ident,LOG_PID,LOG_NOTICE); } char *str_cut(char *str,int len) { static char *buf=NULL; static int buf_len=0; if(buf_len<=len){ if(buf!=NULL){ free(buf); } buf_len=len+1; buf=(char *)calloc(buf_len,sizeof(char)); } strncpy(buf,str,len); buf[len]='\0'; return(buf); } void lprintf(va_alist) //va_dcl { va_list args; char *fmt; char buf[513]; va_start(args, va_alist); fmt=va_arg(args,char *); vsnprintf(buf,sizeof(buf),fmt,args); buf[512]='\0'; if(IsDaemon){ } else{ fflush(stdout); fputs(str_cut(buf,512),stderr); fflush(stderr); } } void lperror(char *str) { char buf[513]; snprintf(buf,sizeof(buf),"%s : %s\n",str,strerror(errno)); buf[512]='\0'; if(IsDaemon){ } else{ fflush(stdout); fputs(str_cut(buf,512),stderr); fflush(stderr); } } #ifdef TEST int main() { char buf[2048]; int i; FILE *fp; InitDaemon("daemon:test",1,1); fprintf(stderr,"stderr\n"); lprintf("start\n"); lprintf("cwd=%s\n",getcwd(buf,sizeof(buf))); for(i=0;i<2047;i++){ buf[i]=i%10+'0'; } buf[2047]='\0'; lprintf(buf); if((fp=fopen("/dev/abcdefg","r"))==NULL){ lperror("fopen"); } lprintf("end\n"); } #endif
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/13 12:29
2021/07/13 12:33
2021/07/13 12:38
2021/07/13 12:39
2021/07/13 12:41
2021/07/13 12:45