apue实验(一):dir 目录遍历

C++的

#if HAVE_CONFIG_H
# include <config.h>
#endif

#include <sys/types.h>
#include <dirent.h>
#include <iostream>

int main(int argc,char* argv[]){
    //setlocale(LC_ALL,"");
    if(argc != 2){
        std::cerr<<"Wrong number of arguments! Need one"<<std::endl;
        return -1;
    }
    const char* dirname=argv[1];
    DIR* dp=opendir(dirname);
    if(dp==NULL){
        std::cerr<<"error when 'opendir' "<<dirname<<std::endl;
        return -1;
    }
    else{
        dirent* dirp;
        while(( dirp=readdir(dp)) !=NULL) 
        std::cout<<dirp->d_name<<"\n";
        closedir(dp);
    }
    return 0;
}

ocaml 的


let rec next_file dir_handle= 
try print_string (Unix.readdir dir_handle);
print_newline();
next_file dir_handle
with
End_of_file -> ();
| Unix.Unix_error(errno,function_name,function_parameter)->
print_string (Unix.error_message errno ) ;
print_newline();
| _ -> Printf.printf "Unknown Error";
();;



let _=
match Sys.argv with
[|procname;dirname;|] ->
try 
let dp=Unix.opendir dirname in
next_file dp;
Unix.closedir dp;
with
Unix.Unix_error(errno,function_name,function_parameter)->
Printf.printf "error when 'opendir' ";
print_string dirname;
print_newline();
print_string (Unix.error_message errno ) ;
print_newline();
| _ -> Printf.printf "Unknown Error";

| _ -> Printf.printf "Wrong number of arguments! Need one\n";

写Makefile的时候遇到了些问题
我是个十足的懒人,不喜欢写一大堆琐碎的Makefile,以前都是用automake/autoconf,可是毕竟太慢了。现在在用bsd的模板。
例如C++的Makefile就是这样

PROG_CXX= dir
SRCS= dir.cpp
NO_MAN= noman
.include <bsd.prog.mk>

然后我是把不同的PROG放在不同的目录下,统一在顶层用SUBDIR=...来引用。
可是ML的就比较麻烦了。
大致是这样的

.SUFFIXES: .o .c .ml .cmx .cpp

MLC=ocamlopt
MLCFLAGS = -w a
.ml.cmx:
$(MLC) $(MLCFLAGS) -c $(.IMPSRC)
.ml.o:
$(MLC) $(MLCFLAGS) -c $(.IMPSRC)

dir:dir.cmx
$(MLC) -o $(.TARGET) unix.cmxa $(.ALLSRC)

可惜不能仿照上面的写,因为BSD的makefile中把.SUFFIXES已经写死了,
它用的是
.SUFFIXES = ...
而不是
.SUFFIXES += ...
不能改,郁闷……
哎……如果Makefile也支持inheritance就好了,从bsd的模板继承一个过来……多好……

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥