الاختلافات في الماكرو المشغل ## سلسلة بين Visual C ++، ودول مجلس التعاون الخليجي

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

سؤال

وأواجه ماكرو مثل هذا (ليس بالضبط، ولكن وظيفة ما يعادل جدا):

#define STRUCTMEMBER(Member,Value) GlobalStructInstance. ## Member = Value
...
STRUCTMEMBER(Item,1);

وهذا يعمل تماما في Visual C ++، ولكن 3.4.5 دول مجلس التعاون الخليجي (MingGW) تسفر عن الخطأ التالي:

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

واللصق "." و "البند" لا يعطي رمز تجهيزها صحيح

وهذا يحدث أيضا عندما استخدم "->" المشغل. لم أكن وجدت تلميحات حول سلسلة، أن استخدام هذه العوامل هو ممنوع.

هل لديها فكرة؟

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

المحلول

وربما البصرية C ++ ولصق بضع مساحات معا لجعل فضاء آخر. ليس ذلك الفراغات والرموز، ولكنها تسمح التعليمات البرمجية للعمل.

وobject.member ليس رمز، انها ثلاثة الرموز، لذلك لا تحتاج رمزية اللصق لتنفيذ الماكرو تصفون. فقط إزالة "##" وينبغي لها أن تعمل في كل مكان.

[تحرير: فقط التحقق، ونتيجة لاستخدام ## لتشكيل ما هو ليس رمز صحيح غير معرف. لذلك سمح دول مجلس التعاون الخليجي لرفضها وسمح MSVC إلى تجاهله وعدم القيام بأي معجون، بقدر ما استطيع ان اقول.]

نصائح أخرى

ووفقا لC القياسية، يجب أن يكون نتيجة لل"##" المشغل تجهيزها ل'تجهيزها رمز "أو نتيجة غير معرف (C99 6.10.3.3 (3) - المشغل ##).

وقائمة الرموز تجهيزها هي (C99 6.4 (3) - العناصر المعجمية):

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

وأسماء رأس، المتطلبات البيئية تحديد الهوية فاي وأرقام تجهيزها، والثوابت شخصية، سلسلة حرفية، punctuators، وشخصيات غير البيض في الفضاء واحدة التي لا تتطابق مع مفرداتيا الآخر تجهيزها فئات رمزية.

ودول مجلس التعاون الخليجي يتيح لك معرفة أنك دخول الأراضي غير محددة. MSVC سعيد بصمت وكانت النتيجة غير محددة (وهذا هو ما كنت تتوقع حد كبير أن يحدث).

لاحظ أنه إذا كنت لا إنشاء رمز واحد على أي حال، فإنك لا تحتاج إلى مشغل لصق رمزية. عموما (أنا متأكد من أن هناك ربما استثناء أو اثنين)، 2 الرموز مفصولة بيضاء ما يعادل 2 الرموز لا تفصل بينها المسافات - كما هو الحال في المثال الخاص بك

.
scroll top