سؤال

extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
 __THROW;

لقد وجدت تعريف الوظيفة أعلاه في /usr/include/netinet/ether.h على مربع Linux.

يمكن للشخص أن يفسر ما يعنيه السفلات الزائدة المزدوجة أمام CONST (كلمة رئيسية)، Addr (معرف) وفي النهاية __ نثرو.

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

المحلول

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

منح:

extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
__THROW;

ال __const الترميز موجودا للسماح بإمكانية (غير مرجع إلى حد ما) أن مترجم يستخدم به هذا الرمز يستخدم بدعم إعلانات النماذج الأولية ولكن ليس لديه فهم صحيح للكلمة الأساسية C89 القياسية const. وبعد ال autoconf لا يزال بإمكان وحدات الماكرو التحقق مما إذا كان التحويل البرمجي لديه دعم عمل const; ؛ يمكن استخدام هذا الرمز مع مترجم مكسور لا يحتوي على هذا الدعم.

استخدام __hostname و __addr هو مقياس حماية لك، مستخدم الرأس. إذا كنت تجميع مع دول مجلس التعاون الخليجي و -Wshadow الخيار، سوف يحذرك المحول البرمجي عند أي متغيرات محلية Shadow متغير عالمي. إذا كانت الوظيفة المستخدمة فقط hostname بدلا من __hostname, ، وإذا كان لديك وظيفة تسمى hostname(), ، سيكون هناك تظليل. باستخدام الأسماء المحجوزة للتنفيذ، لا يوجد تعارض مع كودك الشرعي.

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


القسم 7.1.3 من المعيار C (ISO 9899: 1999) يقول:

7.1.3 المعرفات المحجوزة

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

- يتم دائما حجز جميع المعرفات التي تبدأ بتشطيب الأسفل وإما حرفا كبيرا أو إريا تحت إبطاء آخر عن أي استخدام.

- تتم محجوزة جميع المعرفات التي تبدأ ب Underscore دائما لاستخدامها كمعرف مع نطاق الملفات في مسافات اسم العلامة العادية والعلامة.

- يتم حجز كل اسم ماكرو في أي من الفئات الدراسية الفرعية التالية (بما في ذلك اتجاهات مكتبة المستقبل) للاستخدام كما هو محدد إذا تم تضمين أي من الرؤوس المرتبطة بها؛ ما لم ينص صراحة خلاف ذلك (انظر 7.1.4).

- يتم دائما حجز جميع المعرفات ذات الربط الخارجي في أي من الفئات الفرعية الفرعية التالية (بما في ذلك اتجاهات مكتبة المستقبل) لاستخدامها كمعرفات ذات صلة خارجية.154)

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

لا توجد معرفات أخرى محفوظة. إذا تعلن البرنامج أو يحدد معرفا في سياق محجوز فيه (بخلاف السماح بمقدار 7.1.4)، أو يحدد معرف محجوز باسم ماكرو، فإن السلوك غير محدد.

إذا أزيل البرنامج (مع #undef) أي تعريف ماكرو للمعرف في المجموعة الأولى المدرجة أعلاه، السلوك غير محدد.

الحاشية 154) قائمة المعرفات المحجوزة مع الربط الخارجي تشمل errno, math_errhandling, setjmp, ، و va_end.


أنظر أيضا ما هي القواعد المتعلقة باستخدام الشرطة السفلية في معرف C ++; ؛ تنطبق الكثير من القواعد نفسها على كل من C و C ++، على الرغم من أن قاعدة التدهور المزدوج المضمن في C ++ فقط، كما هو مذكور في الجزء العلوي من هذه الإجابة.

نصائح أخرى

يتم حجز الأسماء ذات السفلات السفلية الأكثر رائدة مزدوجة للاستخدام من خلال التنفيذ. هذا لا يعني بالضرورة أنهم داخلي في حد ذاته، على الرغم من أنهم في كثير من الأحيان.

هذه الفكرة، لا يسمح لك باستخدام أي أسماء تبدأ __, ، وبالتالي فإن التنفيذ مجاني لاستخدامها في أماكن مثل التوسعات الماكرو، أو بأسماء ملحقات بناء الجملة (على سبيل المثال __gcnew ليس جزءا من C ++، لكن مايكروسوفت يمكن أن تضيفها إلى C ++ / CLI واثق من أنه لا ينبغي أن يكون لك رمز موجود شيئا مثل int __gcnew; في ذلك من شأنه أن يتوقف عن تجميع).

لمعرفة ما يعنيه هذه الملحقات المحددة، أي __const ستحتاج إلى استشارة الوثائق الخاصة بالمترجم / النظام الأساسي الخاص بك المحددة. في هذه الحالة بالذات، ربما يجب أن تنظر في النموذج الأولي في الوثائق (على سبيل المثال http://www.kernel.org/doc/man-pages/online/pages/man3/ther_aton.3.html.) أن تكون واجهة الوظيفة وتجاهل __const و __THROW الزخارف التي تظهر في الرأس الفعلي.

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

يعني الشرطة السفلية في __const أن هذه الكلمة الأساسية هي ملحق مترجم واستخدامه غير محمول (تمت إضافة الكلمة الأساسية CONST إلى C في مراجعة لاحقة، 89 أعتقد). __throw هو أيضا نوع من التمديد، أفترض أنه يحدد بعض __attribute __ (شيء) إذا تم استخدام دول مجلس التعاون الخليجي، لكنني لست متأكدا من ذلك والكسر للغاية للتحقق. يمكن أن يعني __ADDR أي شيء يريد مبرمج أنه يعني ذلك، إنه مجرد اسما.

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