سؤال

هي "لا زائدة من الحاجة إلى الحرس" اللازمة في Codegear Rad Studio 2009؟ هل المحول البرمجي ذكي بما يكفي للتعامل مع هذا على ذلك؟

على سبيل المثال، قد يكون لدي ما يلي "وتشمل الحرس" في foo.h:

#ifndef fooH
#define fooH
// ... declaration here
#endif

وما يلي "الحزمة الزائدة" الحرس "في use_foo.h:

#ifndef fooH
    #include "foo.h"
#endif

بالإضافة إلى ذلك، إذا لم يكن المحول البرمجي ذكيا بما فيه الكفاية، فهناك "ضرورة زائدة عن الحاجة إلى الحرس" إذا تم تضمينها في ملف مصدر. على سبيل المثال use_foo.cpp. ?

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

المحلول

جزء من التعليمات البرمجية التي حددتها ك "الحزانة الزائدة" ليست ضرورية ولكن المستطاع الاقوي.

في حالة C ++ Builder، يوجد منطق للكشف عن حراس الرأس، لذلك لا ينبغي أن يكون ضروريا.

في الحالة العامة، يكون تمرير ما قبل البيع عادة سريعا في أي حال، لذلك من غير المرجح أن هذه سيشتري التحسين لك كثيرا على أي حال.

نصائح أخرى

تهدف هذه الحراس الزائدة إلى حدوث حشيين لتحاكظ وظيفة المقترح #pragma once التوجيه: إذا تم بالفعل تضمين بعض ملف الرأس بالفعل، فلن يحاول Preprocessor حتى تحديد موقع، فتح وتحليله بعد الآن (لأنه يجب أن يتضمن مع تقنية الحرس "العادي"). في كثير من الحالات، هذا يجعل التعامل مع الملفات تشمل أكثر كفاءة بكثير (يسرع تجميع).

من الواضح أن هذا النهج هو واحد صيانة عالي الصيانة: يجب على المرء أن يتأكد من أن الإملاء من رمز الحرس هو نفسه تماما داخل ملف الرأس وكذلك في الخارج.

"الحزانة الزائدة العلم"، كما تسميه، يسرع تجميع.

بدون حارس زائد، سيقوم المحول البرمجي بتكرار ملف Foo.h بأكمله، يبحث عن بعض الكود الذي قد يكون خارج #ifndef منع. إذا كان ملف طويل، ويتم ذلك العديد من الأماكن، فقد يضيع المترجم الكثير من الوقت. ولكن مع الحرس الزائد، يمكن أن تخطي كامل #include بيان ولا حتى إعادة فتح هذا الملف.

بالطبع، يجب عليك تجربة ومشاهدة مقدار الوقت الفعلي يضيع من المترجم التكرار من خلال foo.h وليس في الواقع تجميع أي شيء؛ وربما المترجمات الحديثة تبحث بالفعل عن هذا النمط ويعرف تلقائيا عدم إزعاج الملف على الإطلاق، لا أعرف.

(ابدأ تحرير بواسطة 280Z28)

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

// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED

// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#   pragma once
#endif

// header text goes here.

#endif

(نهاية تحرير)

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