سؤال

ما ينبغي رؤوس أعلنت في رأس / cpp الملف ؟ ومن الواضح أن تلك المطلوبة من قبل اللاحقة رؤوس ينبغي أن تكون في وقت سابق فئة محددة رؤوس ينبغي أن يكون في cpp نطاق لا رأس النطاق ، ولكن هناك مجموعة أجل الاتفاقية / أفضل الممارسات ؟

هل كانت مفيدة؟

المحلول

في رأس الملف يجب أن تشمل جميع رؤوس لجعله compilable.و لا تنسى أن استخدام الأمام الإعلانات بدلا من بعض الرؤوس.

في الملف المصدر:

  • يتفق مع الاستراتيجية رأس الملف
  • من الضروري المشروع رؤوس
  • 3rd الطرف المكتبات رؤوس
  • المكتبات القياسية رؤوس
  • نظام رؤوس

في هذا النظام سوف لا يغيب عن أي من رأس الملفات التي نسيت أن تشمل المكتبات الخاصة بها.

نصائح أخرى

والممارسة الجيدة: يجب أن يكون كل ملف .h و.cpp الذي يتضمن أن .H أولا قبل أي شيء آخر. وهذا يثبت أن أي ملف .h يمكن طرحت لأول مرة.

وحتى إذا كان رأس يتطلب أي تنفيذ، وجعل لكم .cpp الذي يشمل فقط أن .H ملف ولا شيء غير ذلك.

وهذا يعني أنه بعد ذلك يمكنك الإجابة على سؤالك وبالطريقة التي تريدها. لا يهم ما الترتيب الذي يدرجها في.

لمزيد من النصائح كبيرة، حاول هذا الكتاب: واسع النطاق C ++ تصميم البرمجيات - انه من العار انها مكلفة جدا، ولكن من الناحية العملية دليل البقاء على قيد الحياة للتخطيط شفرة المصدر C ++

.

في رأس الملفات، فإنني أميل إلى وضع رؤوس القياسية أولا، ثم رؤوس بلدي (كلا القائمتين يجري مرتبة أبجديا). في ملفات التنفيذ، وأنا طرحت لأول مرة على رأس المقابلة (إن وجدت)، ثم رؤوس المقاييس وغيرها من رؤوس التبعية.

والنظام هو من أهمية تذكر، إلا إذا قمت بإجراء فائدة كبيرة من وحدات الماكرو و#define. في هذه الحالة، يجب أن تأكدت من أنه ماكرو قمت بتعريفه لا يحل تدرج سابقا واحد (إلا إذا كان هذا ما تريد، وبطبيعة الحال).

وبخصوص هذا البيان

<اقتباس فقرة>   

وتلك التي مطلوبة من قبل رؤوس اللاحقة يجب أن تكون في وقت سابق

وهناك رأس يجب أن لا تعتمد على رؤوس الأخرى التي يتم تضمينها قبل ذلك! إذا كان يتطلب رؤوس، انها مجرد يشمل لهم. سوف حراس رأس منع إدراج متعددة:

#ifndef FOO_HEADER_H
#define FOO_HEADER_H
...
#endif

تحرير

وبما أنني كتبت هذا الجواب، لقد غيرت طريقتي في يأمر تشمل التوجيهات في قانون بلدي. الآن، أنا أحاول أن أضع دائما الرؤوس في زيادة ترتيب التوحيد، وبالتالي فإن رؤوس مشروعي تأتي أولا، تليها 3RD رؤوس المكتبات طرف، تليها رؤوس القياسية.

وعلى سبيل المثال، إذا كان أحد ملفي يستخدم مكتبة كتبت، كيو تي، دفعة والمكتبة القياسية، وسوف تأمر يشمل على النحو التالي:

//foo.cpp
#include "foo.hpp"

#include <my_library.hpp>
// other headers related to my_library

#include <QtCore/qalgorithms.h>
// other Qt headers

#include <boost/format.hpp> // Boost is arguably more standard than Qt
// other boost headers

#include <algorithms>
// other standard algorithms

والسبب أن أفعل ذلك للكشف عن تبعيات مفقودة في رؤوس بلدي: لنفترض على سبيل المثال أن my_library.hpp يستخدم std::copy، ولكنه لا يشمل <algorithm>. إذا كنت إدراجه بعد <algorithm> في foo.cpp، وهذه التبعية في عداد المفقودين تمر مرور الكرام. على العكس من ذلك، مع النظام قدمت للتو، فإن المترجم يشكو لم أعلن أن std::copy، السماح لي لتصحيح my_library.hpp.

في كل مجموعة "مكتبة"، ومحاولة للحفاظ على وتشمل التوجيهات مرتبة أبجديا، للعثور عليهم بسهولة أكبر.

وعلى sidenote، وهي ممارسة جيدة أيضا للحد كحد أقصى التبعية بين الملفات رأس. وينبغي أن تتضمن ملفات الرؤوس أقل قدر ممكن، ملف خصوصا الرؤوس. في الواقع، والمزيد من رؤوس قمت بتضمين، يحتاج مزيد من رموز ليتم معاد عندما يتغير شيء. وهناك طريقة جيدة للحد من هذه التبعيات لاستخدام الإعلان إلى الأمام، والذي هو غاية في كثير من الأحيان كافية في الملفات رأس (انظر متى يمكنني استخدام الإعلان إلى الأمام ؟ ).

جوجل C++ دليل نمط وأسماء ترتيب يشمل :

في دير/foo.cc ، وهدفها الرئيسي هو تنفيذ أو اختبار الاشياء في dir2/foo2.ح ، وذلك يشمل على النحو التالي:

  • dir2/foo2.ح (الموقع المفضل — انظر التفاصيل أدناه).
  • ج نظام الملفات.
  • C++ ملفات النظام.
  • المكتبات الأخرى .ساعة الملفات.
  • المشروع الخاص بك .ساعة الملفات.

واعتدت على ترتيبها حسب الترتيب الأبجدي (أسهل للعثور)

وو"كيف" ليست واضحة، ولكن "ما" هو. هدفك هو للتأكد من أن الترتيب الذي قمت بتضمين الملفات رأس يهم أبدا (وأعني "NEVER!").

وومساعدة جيدة لاختبار ما إذا كان رأس الملفات وتجميع الملفات عند بناء حزب الشعب الكمبودي (واحد لكل ملف الرأس) التي تتضمن واحدا منها فقط.

لملفات .CPP، يجب أن تشمل رأس الطبقة أو ما تنفذ لأول مرة، لذلك يمكنك التقاط الحالة حيث يتم هذا الرأس مفقود يتضمن بعض. بعد ذلك، تميل معظم المبادئ التوجيهية الترميز لتشمل رؤوس النظام أولا، ورؤوس المشروع الثاني، على سبيل المثال في جوجل C ++ دليل نمط .

وإنه لأمر التبعية وذلك يعتمد إلى حد كبير على ما كنت وضعت في رؤوس لدينا. والحقيقة هي أنه يمكنك أن تكون سيئة السمعة حقا حول هذا الموضوع وتقليل للحفاظ يشمل بك صارم ولكن عليك تشغيل في نهاية المطاف إلى سيناريو حيث عليك تريد استخدام حراس إدراج.

#ifndef MY_HEADER_H
#define MY_HEADER_H
//...
#endif

والمشكلة ليست واضحة في البداية، ولكن كما تعقيد البرنامج ينمو حتى لا التبعيات الخاصة بك. يمكنك القيام به بشكل جيد، وتكون ذكية حول هذا الموضوع ولكن غربل المشاريع الكبيرة C ++ عموما يشمل. يمكنك أن تجرب، ولكن يمكنك فعل الكثير. حتى يكون الاجتهاد والتفكير الخاص بك يتضمن، نعم! ولكن سيكون لديك بالتأكيد تبعيات دوري في مرحلة ما، وهذا هو السبب في أنك بحاجة حراس إدراج.

إذا رأس يحتاج رؤوس أخرى بعد ذلك فقط ويشمل لهم في ذلك الرأس.

وحاول هيكلة التعليمات البرمجية بحيث يمكنك تمرير مؤشرات أو مراجع وإلى الأمام يعلن حيث يمكنك.

في تنفيذ ثم رأس الذي يعرف أنه يجب أن يتم سرد أولا (إلا في Visual Studio إذا كنت تستخدم برستيج ثم stdafx سيذهب الأول).

وأسرد لهم عموما وأنا في حاجة.

ولقد وجدت الاتفاقية التالية الأكثر فائدة:

وmodule.cpp:

// this is the header used to trigger inclusion of precompiled headers
#include <precompiled.h> 
// this ensures that anything that includes "module.h" works
#include "module.h"
// other headers, usually system headers, the project

والشيء المهم هو وضع رأس وحدة كأول رأس غير المترجمة مسبقا. وهذا يضمن "module.h" لا يوجد لديه تبعيات غير متوقعة.

إذا كنت تعمل على مشروع كبير مع أوقات الوصول إلى القرص بطيئة، لقد رأيت هذا النمط المستخدم لتقليل مرات بناء:

وmodule.cpp:

// this is the header used to trigger inclusion of precompiled headers
#include <precompiled.h> 
// this ensures that anything that includes "module.h" works
#include "module.h"
// other headers, usually system headers, the project
#if !defined _OTHER_MODULE_GUARD_
#include "other_module.h"
#endif 

#if !defined _ANOTHER_MODULE_GUARD_
#include "another_module.h"
#endif 

وانها مطول بعض الشيء ولكن لا انقاذ على السعي القرص منذ الرأس لن يتم البحث عن / فتح إذا بالفعل تم تضمينه. دون الاختيار حارس، سيسعى مترجم وفتح ملف الرأس، تحليل الملف بأكمله في نهاية المطاف #ifdefing الملف بأكمله خارج.

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