0

在第 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 中?这就是为什么他说:

“编译器没有足够的信息来检查命名空间的两个定义的一致性”

  • 因为implementer.h和user.h都不能包含在“Parser implementation”(parse.cpp)中?

172.png 173.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

4

2 回答 2

1

http://groups.google.com/group/alt.comp.lang.learn.c-c++/browse_thread/thread/3be9f35f2969f311/0d418ec6138a7e58#0d418ec6138a7e58

(关于编译器一致性的部分是错误的,上面的线程说明了原因:是的,实现可以而且应该这样做,但是一致性检查只能在一定程度上起作用。如果 user.h 使用了没有在那里声明的东西,你将得到一个诊断。如果你在一个地方声明了“double expr(bool);”而在另一个地方声明了“float expr(bool);”,编译器也应该给你一个诊断。但是,如果你将第二个更改为“float expr(int);”,那么这只是一个完全合法的 C++ 重载。- Ulrich Eckhardt)

于 2012-03-14T16:20:48.020 回答
0

我相信您所有三个问题的答案都是“是”

于 2012-03-11T03:43:35.313 回答