Xref: utzoo comp.lang.c:23190 comp.lang.c++:5186 gnu.g++:465 Path: utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!rochester!ken From: ken@cs.rochester.edu (Ken Yap) Newsgroups: comp.lang.c,comp.lang.c++,gnu.g++ Subject: Re: A solution to the multiple inclusion problem Keywords: #include c c++ Message-ID: <1989Oct24.060920.28655@cs.rochester.edu> Date: 24 Oct 89 06:09:20 GMT References: <14240@well.UUCP> <1989Oct23.191634.6345@cs.rochester.edu> Reply-To: ken@cs.rochester.edu Distribution: comp Organization: University of Rochester Computer Science Department Lines: 74 Address: Rochester, NY 14627, (716) 275-1448 |(1) An include file protects itself via #ifndef on a symbol that it defines. | This causes the file to be read multiple times. But is this really as inefficient as people think? I tried the following on a Sun-4/60 % wc grammar0.cc 932 2944 19700 grammar0.cc % g++ -I../h -E grammar0.cc | wc 3728 8219 63497 % time g++ -I../h -E grammar0.cc > /tmp/foo.cc 0.4u 0.3s 0:01 44% 0+208k 0+9io 0pf+0w Looks pretty insignificant compared to parsing and CG time. Just to prove that multiple inclusions were attempted % grep '#' /tmp/foo.cc | sort +2 -3 | uniq -2 -c 2 # 1 "../h/pg_types.h" 1 1 # 42 "../h/pg_types.h" 1 # 1 "/usr/su/lib/g++-include/BitSet.h" 1 2 # 28 "/usr/su/lib/g++-include/BitSet.h" 2 1 # 1 "/usr/su/lib/g++-include/File.h" 1 3 # 27 "/usr/su/lib/g++-include/File.h" 2 1 # 1 "/usr/su/lib/g++-include/builtin.h" 1 3 # 48 "/usr/su/lib/g++-include/builtin.h" 2 1 # 1 "/usr/su/lib/g++-include/math.h" 1 1 # 126 "/usr/su/lib/g++-include/math.h" 2 2 # 1 "/usr/su/lib/g++-include/std.h" 1 1 # 225 "/usr/su/lib/g++-include/std.h" 2 # 1 "/usr/su/lib/g++-include/stddef.h" 1 1 # 59 "/usr/su/lib/g++-include/stddef.h" 1 # 1 "/usr/su/lib/g++-include/stdio.h" 1 2 # 1 "/usr/su/lib/g++-include/stream.h" 1 1 # 160 "/usr/su/lib/g++-include/stream.h" 1 # 27 "/usr/su/lib/g++-include/stream.h" 2 2 # 1 "/usr/su/lib/g++-include/values.h" 1 2 # 92 "/usr/su/lib/g++-include/values.h" 1 # 1 "error.h" 1 2 # 1 "grammar.h" 1 2 # 11 "grammar.h" 2 1 # 127 "grammar.h" 4 # 13 "grammar.h" 2 1 # 1 "grammar0.cc" 10 # 1 "grammar0.cc" 2 2 # 1 "item.h" 1 1 # 98 "item.h" 2 # 1 "option.h" 1 1 # 40 "option.h" 1 # 1 "pg.h" 1 2 # 10 "pg.h" 2 1 # 1 "pggram.h" 1 1 # 1 "predict.h" 1 1 # 9 "predict.h" 2 1 # 1 "production.h" 1 3 # 10 "production.h" 2 5 # 1 "symbol.h" 1 1 # 10 "symbol.h" 2 4 # 140 "symbol.h" 1 # 9 "symbol.h" 2 4 # 1 "symset.h" 1 2 # 10 "symset.h" 2 3 # 84 "symset.h" 1 # 9 "symset.h" 2 1 # 1 "symtab.h" 1 1 # 9 "symtab.h" 2 3 # 1 "termset.h" 1 2 # 50 "termset.h" 1 # 9 "termset.h" 2 Some of the .h files are pretty hefty, as you can see from the size of the expanded source. I don't think I will lose any sleep over what cpp is doing.