ما هو الفرق بين توجيهات المترجم هذه؟
-
19-09-2019 - |
سؤال
ماذا، إذا كان أي شيء، هو الفرق بين هذه التوجيهات؟
#ifdef FOO
#if defined FOO
#if defined(FOO)
أنا أستخدم مترجم CCS، لكنني مهتم بالآخر جيم الجمعية كذلك.
المحلول
من ما رأيته، الاستخدام الرئيسي ل #if defined
هو القيام بفحص تعريفات ماكرو متعددة على سطر واحد. خلاف ذلك، بالنسبة لشرائح تعريف الماكرو الفردية، فهي متطابقة بقدر ما أعرف.
#include <stdio.h>
int main()
{
#if defined(FOO) && defined(BAR)
printf("foobar!\n");
#else
printf("nothing.\n");
#endif
return 0;
}
$ TCC -DFOO -REN AC لا شيء. $ TCC -DBAR -REN AC لا شيء. $ TCC -DFOO -DBAR -REN AC Foobar!
أيضا، البرنامج أعلاه يجمع بشكل جيد مع gcc -Wall -ansi a.c
بحيث يقترح #if defined
هو الصحيح ansi c. علاوة على ذلك، ملخص ANSI C من 1987 قوائم #if defined
كما هو سلوك محدد حديثا للمادة المعالجة بموجب معايير ANSI - هذا ينبغي كن قياسي عبر أي برنامج تحويل متوافق مع ANSI، وسوف تستخدمه.
إذا كنت لا تستخدم #if defined
, ، عليك أن تفعل
#ifdef FOO
#ifdef BAR
printf("foobar!\n");
#endif /* BAR */
#endif /* FOO */
أيضا، دليل redhat ل c preprocessor c يقول
#if defined MACRO
يعادل بدقة#ifdef MACRO
.
نصائح أخرى
جميع الأشكال الثلاثة تعادل بالضبط وصالحها، وفقا لمعايير C99. عموما #ifdef
يفضل لأنه أقصر من النموذجين الآخرين، ولكن هناك مواقف ترغب في استخدام النماذج الأخرى:
إذا تم الاختبار لتعريفات الرموز المتعددة، أو تعبيرات أكثر تعقيدا:
#if defined(ONE_THING) && define(ANOTHER_THING) && (3 < 4) ... #endif
إذا كان لديك بنود متعددة، فمن الأسهل استخدامها
#elif defined(...)
من#else
,#ifdef
:#if defined(ONE_THING) ... #elif defined(ANOTHER_THING) ... #elif defined(THIRD_THING) ... #else ... #endif
استخدام الأقواس مع defined
هو اختياري؛ أفضل استخدامها لإضافة الوضوح.
#ifdef. هو اختصار ل # إذا حددت وأعتقد أنك لا تحتاج إلى قوسين على أي شيء، لذلك هم أساسا هم نفس الشيء.
القادمة من توربو ج، اعتدت أن أبحث في #ifdef. بدلا من # إذا حددت
في الأصل كان هناك فقط #ifdef
, ، لكن عندما #if
جاء على طول كان ضروري defined()
من أجل #if
إلى superset. #ifdef
.