سؤال

ماذا، إذا كان أي شيء، هو الفرق بين هذه التوجيهات؟

#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.

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