سؤال

في الصفحة 172، يقوم ستروستروب بشيء من هذا القبيل:

  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>
  }

س1. هل هذا يعني أنه تم إدراج مساحة الاسم الأولى في (على سبيل المثال) user.h وتضمينها من main.cpp - برنامج التشغيل؛مساحة الاسم الثانية في Attacher.h وتم تضمينها من parse.cpp؟فهل لهذا يقول:

"ليس لدى برنامج التحويل البرمجي معلومات كافية للتحقق من اتساق التعريفين لمساحة الاسم"

  • لأنه لا يمكن تضمين كل من المنفذ.h والمستخدم.h في "تطبيق المحلل اللغوي" (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"هل يكرر ما هو واضح:أنه عند تشغيل إجراء، أي تغيير إلى "المحلل"(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 يستخدم الأشياء التي لم يتم إعلانها هناك ، فستحصل على تشخيص.إذا كان لديك "expr مزدوج (منطقي) ؛" أعلن في مكان واحد و "تعويم expr (bool) ؛" في آخر ، يجب أن يمنحك المترجم أيضًا تشخيصًا.ومع ذلك ، إذا قمت بتغيير الثاني إلى "تعويم Expr (int) ؛" ، فهذا مجرد تحميل زائد وهو C ++ قانوني تمامًا.- أولريش إيكهاردت)

نصائح أخرى

أعتقد أن الإجابات على أسئلتك الثلاثة هي "نعم"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top