macros - هل#pragma مرة واحدة جزء من معيار C++11؟




header-files c++14 (3)

تقليديًا ، كانت الطريقة القياسية والمحمولة لتجنب تضمين رؤوس متعددة في C ++ هي استخدام #ifndef - #define - #endif pre-compiler directives يُدعى أيضًا نظام الحماية من الماكرو (راجع مقتطف الشفرة أدناه).

#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif

في معظم التطبيقات / المجمعات (انظر الصورة أدناه) ، يوجد بديل "أنيق" أكثر يخدم نفس الغرض مثل نظام الحماية من #pragma once يسمى #pragma once . #pragma once تمتاز بالعديد من المزايا مقارنة مع نظام الحماية من الماكرو ، بما في ذلك رمز أقل ، وتجنب الصدامات الاسمية ، وأحيانا تحسين سرعة الترجمة.

قمت ببعض الأبحاث ، أدركت أنه على الرغم من أن #pragma once موجهًا #pragma once مدعومًا من قبل جميع المترجمين المعروفين تقريبًا ، فهناك عثرة على ما إذا كانت #pragma once توجيهًا واحدًا هو جزء من معيار C ++ 11 أم لا.

الأسئلة:

  • هل يمكن لأي شخص توضيح ما إذا كانت #pragma once التوجيه هي جزء من معيار C ++ 11 أم لا؟
  • إذا لم يكن جزءًا من معيار C ++ 11 ، فهل هناك أي خطط لإدراجه في الإصدارات الأحدث (مثل C ++ 14 أو ما بعده)؟
  • سيكون من اللطيف أيضًا أن يقوم شخص ما بمزيد من التفصيل حول المزايا / العيوب في استخدام إحدى التقنيات (أي ، الحماية الكلية مقابل #pragma once ).

Answers

يصف القسم §16.6 من المعيار (مسودة N3936 ) #pragma النحو التالي:

توجيه مسبق المعالجة للنموذج

# pragma pp-tokensopt new-line

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

أساسا #pragma once هو مثال معين للتنفيذ من التوجيه #pragma ، ولا ، ليس قياسي. بعد.

غالباً ما يتم دعمه على نطاق واسع من قبل معظم "المترجمين الرئيسيين" بما في ذلك GCC Clang ، وبالتالي يوصى في بعض الأحيان بتجنب حاجز تضمين الحواجز.


#pragma once ليست قياسية. إنه امتداد واسع (لكن ليس عالمي) ، والذي يمكن استخدامه

  • إذا كانت مخاوفك الخاصة بالنقل محدودة ، و
  • يمكنك التأكد من أن كافة ملفات التضمين الخاصة بك دوماً على قرص محلي.

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

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


إذا كان لديك شيء مثل:

std::vector<int> foo(); // function declaration.
std::vector<int> v;

// some code

v = foo();

لقد حصلت على نسخة في C ++ 03 ، في حين حصلت على مهمة النقل في C ++ 11. بحيث يكون لديك تحسين مجاني في هذه الحالة.





c++ c++11 macros header-files c++14