LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 827|回复: 5

W.Richard.Stevens的Unix环境高级编程的ourhdr.h报错!!

[复制链接]
发表于 2007-3-25 18:54:34 | 显示全部楼层 |阅读模式
照着书上给的第一个源代码保存为myls.c:
#include<sys/types.h>
#include<dirent.h>
#include "ourhdr.h"
int
main(int argc,char *argv[])
{DIR *dp;
struct dirent *dirp;
if (argc !=2)
         err_quit("a single argument (the directory name) is required");
if ((dp=opendir(argv[1]))==NULL)
         err_sys("can't open %s",argv[1]);
while((dirp=readdir(dp))!=NULL)
         printf("%s\n",dirp->d_name);
closedir(dp);
exit(0);
}

编译时出现:
In file included from myls.c:3:
ourhdr.h:99:2: #endif without #if
可下面的#endif 不是和第一个#ifndef __ourhdr.h对应的么?
到底哪出问题了?

/*Our own header,to be included *after* all standard system headers* /

#ifndef __ourhdr_h
#define __ourhdr_h
#include <sys/types.h>  /*requiredfor some of our prototypes*/
#include<stdio.h>      /*for convenience*/
#include<stdlib.h>       /*for convenience*/
#include<string.h>      /*for convenience*/
#include<unistd.h> /*for convenience*/
#define MAXLINE 4096 /*max line length*/
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|s_IROTH)       /*default file access permissions for new files*/
#define DIR_MODE    (FILE_MODE|s_IXUSR|S_IXGRP|S_IXOTH)   /*default permissions for new directories*/
typedef void Sigfunc(int);           /*for signal handlers*/
                                    /* 4.3BSD Reno<signal.h> doesn't define SIG_ERR*/

#if defined(SIG_IGN)&& !defined(SIG_ERR)
#define SIG_ERR ((Sigfunc *)-1)
#endif
#define min(a,b)   ((a)<(b)?(a)b))
#define max(a,b)   ((a)>(b)?(a)b))
                                 /* prototypes for our own functions */
char *path_alloc(int *);           /*program2.2*/
int open_max(void);               /*Program 2.3*/

void clr_fl(int,int);            /*Program 3.5*/
void set_fl(int,int);            /*Program 3.5/
void pr_exit(int);              /*Program 8.3*/
void pr_mask(const char*);      /*Program 10.10*/
Sigfunc *signal_intr(int,Sigfunc*);/*Program 10.13*/

int tty_cbreak(int);            /*Program 11.10*/
int tty_raw(int);               /*Program 11.10*/
int tty_reset(int);             /*Program 11.10*/
void tty_atexit(void);          /*Program 11.10*/
#ifdef ECHO                    /* only if <termios.h>has been included*/
struct termios *tty_termios(void);         /*Program 11.10*/
#endif

void sleep_us(unsigned int);       /*Exercise12.6*/
ssize_t readn(int,void*,size_t);   /*Program 12.13*/
ssize_t writen(int,const void*,size_t);  /*Program 12.12*/
int daemon_init(void);  /*Program 13.1*/

int s_pipe(int*); /*Program15.2 and 15.3*/
int recv_fd(int,ssize_t (*func)(int,const void*,size_t));/*Program 15.6 and 15.8*/

int send_fd(int,int); /*Program 15.5 and 15.7*/
int send_err(int,int,const char*); /*Program 15,4*/
int serv_listen(const char*);  /*Program 15.19 and 15.22*/
int serv_accept(int,uid_t*); /*Program 15.20 and 15.24*/
int cli_conn(const char*); /*Program 15.21 and 15.23*/
int buf_args(char*,int(*func)(int,char**)); /*Program 15.17*/

int ptym_open(char*); /*Program 19.1 and 19.2*/
int ptys_open(int,char*);   /*Program 19.1 and 19.2*/
#ifdef TIOCGWINSZ
pid_t pty_fork(int *,char *,const struct termios *,
                struct winsize*);   /*Program 19.3*/
#endif

int lock_reg(int ,int,int,off_t,int,off_t);  /*Program 12.2*/

#define read_lock(fd,offset,whence,len) \
           lock_reg(fd,F_SETLK,F_RDLCK,offset,whence,len)
#define readw_lock(fd,offset,whence,len) \
           lock_reg(fd,F_SETLKW,F_RDLCKW,offset,whence,len)
#define write_lock(fd,offset,whence,len) \
           lock_reg(fd,F_SETLK,F_WRLCK,offset,whence,len)
#define writew_lock(fd,offset,whence,len) \
           lock_reg(fd,F_SETLK,F_WRLCKW,offset,whence,len)
#define un_lock(fd,offset,whence,len) \
           lock_reg(fd,F_SETLK,F_UNLCK,offset,whence,len)
pid_t lock_test(int,int,off_t,int,off_t);  /* Program 12.3 */

#define is_readlock(fd,offset,whence,len) \
           lock_test(fd,F_RDLCK,offset,whence,len)
#define is_writelock(fd,offset,whence,len) \
           lock_test(fd,F_WRLCK,offset,whence,len)

void err_dump(const char*,...); /*Appendix B */
void err_msg(const char*,...);
void err_quit(const char*,...);
void err_ret(const char*,...);
void err_sys(const char*,...);

void log_msg(const char*,...);   /*Appendix B */
void log_open(const char*,...);
void log_quit(const char*,...);
void log_ret(const char*,...);
void log_sys(const char*,...);

void TELL_WAIT(void);     /*parent/child from Section 8.8 */
void TELL_PARENT(pid_t);
void TELL_CHILD(pid_t);
void WAIT_PATENT(void);
void WAIT_CHILD(void);

#endif  /*__ourhdr.h*/
 楼主| 发表于 2007-3-26 08:55:40 | 显示全部楼层
怎们人回啊,很急的......
回复 支持 反对

使用道具 举报

发表于 2007-3-26 11:12:10 | 显示全部楼层
把ourhdr.h换成stdio.h  
err_quit,err_sys全换成pritnf
应该会通过
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-26 11:14:29 | 显示全部楼层
可是可以.不过我还是用书上的例子.
回复 支持 反对

使用道具 举报

发表于 2007-3-26 11:20:49 | 显示全部楼层
这个问题我没深究,毕竟这个问题不影响我们去理解程序的含义
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-26 21:16:15 | 显示全部楼层
找到原因了
/*Our own header,to be included *after* all standard system headers* /最后我竟然把 * /分开了,导致这行开头/*竟然和#include <sys/types.h> /*requiredfor some of our prototypes*/中的 */构成注释,把其间的东西全注释掉了,所以就没有#ifndef了
才会出现#endif without #if
自己太粗心了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表