c - ريفيرسو - معنى كلمة عنوان بالانجليزي




ما فائدة القيام به أثناء(0) عندما نحدد الماكرو؟ (2)

ممكن تكرار:
Do-While وبيانات if-else في وحدات الماكرو C / C ++

أنا أقرأ نواة لينكس ولقد وجدت العديد من وحدات الماكرو مثل هذا:

#define INIT_LIST_HEAD(ptr) do { \
    (ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)

لماذا يستخدمونها بدلاً من تعريفها ببساطة في {}؟


يسمح لك بتجميع عدة عبارات في ماكرو واحد.

افترض أنك فعلت شيئًا مثل:

if (foo) 
    INIT_LIST_HEAD(bar);

إذا تم تعريف الماكرو بدون تغليف {...} أثناء (0) ؛ ، سيتم توسيع التعليمة البرمجية أعلاه إلى

if (foo)
    (bar)->next = (bar);
    (bar)->prev = (bar);

من الواضح أن هذا لم يكن المقصود ، حيث سيتم تنفيذ البيان الأول فقط إذا كان يحمل فو. سيتم تنفيذ البيان الثاني بغض النظر عما إذا كان يحمل foo.

تعديل: مزيد من الشرح على http://c-faq.com/cpp/multistmt.html و http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon


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

بدون الوقت (0) ، لن يعمل كودك أعلاه

if (doit) 
   INIT_LIST_HEAD(x);
 else 
   displayError(x);

بما أن الفاصلة المنقوطة بعد الماكرو "ستأكل" عبارة "آخر" ، وما سبق لن يتم تجميعها.





linux-kernel