在第172页上,Stroustrup正在做这样的事情:
namespace Parser { //interface for users
double expr(bool);
}
namespace Parser { //interface for implementers
double prim(bool);
double term(bool);
double expr(bool);
using Lexer::get_token;
<SNIP>
}
Q1。这是否意味着第一个命名空间被插入(例如)user.h中,并从main.cpp(驱动程序)中包含;第二个命名空间进入implementer.h,并包含在parse.cpp中?这就是为什么他说:
"编译器没有足够的信息来检查一致性名称空间""的两个定义之一
- 因为implementation.h和user.h都不能包含在"Parser implementation"(parse.cpp)中
172.png173.png
在174页,他有:
namespace Parser { //interface for implementers
// ...
double expr(bool);
// ...
}
namespace Parser_interface { //interface for users
using Parser::expr;
}
上层命名空间进入implementer.h,下层命名空间进入user.h
在他的"dependency graph
"中,他是否重申了一个显而易见的事实:当Make运行时,对"Parser"(parser.cpp/implementer.h
)的任何更改都将导致driver/main.cpp被重新构建——这是不必要的?
174.png
http://groups.google.com/group/alt.comp.lang.learn.c-c++/browse_thread/thread/3be9f35f2969f311/0d418ec6138a7e58#0d418ec6138a7e58
(关于编译器一致性的部分是错误的,上面的线程说明了原因:是的,实现可以而且应该做到这一点,但是一致性只在一定程度上起作用。如果user.h使用的东西如果没有在那里声明,你会得到诊断。如果你有"double"expr(布尔);"在一个位置声明"one_answers"float expr(bool);"在另一个中编译器还应该为您提供诊断。但是,如果您更改第二个是"float expr(int);",那么这只是一个重载完全合法的C++。-Ulrich Eckhardt)
我相信你所有三个问题的答案都是"是的"