خطأ: يجب أن تكون أسماء الكلي معرفات باستخدام #IFDEF 0

StackOverflow https://stackoverflow.com/questions/426736

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي شفرة المصدر من تطبيق مكتوب في C ++، وأريد فقط أن أعلق شيء باستخدام:

#ifdef 0
...
#endif

وأحصل على هذا الخطأ

<اقتباس فقرة>   

خطأ: يجب أن تكون أسماء الكلي معرفات

لماذا يحدث هذا؟

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

المحلول

ويتم استخدام التوجيه #IFDEF للتحقق <م> إذا تم تعريف رمز المعالج المعيار (C11 6.4.2 Identifiers) ولايات معرفات يجب أن لا تبدأ برقم:.

identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit
identifier-nondigit:
    nondigit
    universal-character-name
    other implementation-defined characters>
nondigit: one of
    _ a b c d e f g h i j k l m
    n o p q r s t u v w x y z
    A B C D E F G H I J K L M
    N O P Q R S T U V W X Y Z
digit: one of
    0 1 2 3 4 5 6 7 8 9

والنموذج الصحيح لاستخدام قبل المعالج لحجب متاحة:

#if 0
: : :
#endif

ويمكنك أيضا استخدام:

#ifdef NO_CHANCE_THAT_THIS_SYMBOL_WILL_EVER_EXIST
: : :
#endif

ولكن عليك أن تكون واثقا أن الرموز و<م> لا يتم تعيين بشكل غير مقصود من قبل رمز آخر من بنفسك. وبعبارة أخرى، لا تستخدم شيء من هذا القبيل NOTUSED أو DONOTCOMPILE التي قد تستخدم الآخرين أيضا. أن تكون آمنة، ينبغي تفضيل الخيار #if.

نصائح أخرى

استخدم ما يلي لتقييم تعبير (ثابت 0 بتقييم إلى false).

#if 0
 ...
#endif

ويمكن أن يحدث هذا الخطأ أيضا إذا كنت لا تتبع القواعد ماركو

ومثل

#define 1K 1024 // Macro rules must be identifiers error occurs

والسبب: ماكرو يجب أن تبدأ بحرف وليس عددا

والتغيير إلى

#define ONE_KILOBYTE 1024 // This resolves 
#ifdef 0
...
#endif

و#IFDEF نتوقع ماكرو بدلا من التعبير عند استخدام ثابت أو التعبير

#if 0
...
#endif

أو

#if !defined(PP_CHECK) || defined(PP_CHECK_OTHER)
..
#endif

وإذا تم استخدام #IFDEF التقارير التي هذا الخطأ

#ifdef !defined(PP_CHECK) || defined(PP_CHECK_OTHER)
..
#endif

وأين #IFDEF نتوقع ماكرو بدلا من expresssion على الماكرو

لاحظ أنه يمكنك أيضا ضرب هذا الخطأ إذا كتبت عن طريق الخطأ:

#define <stdio.h>

... بدلا من ...

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