الاختلافات في الماكرو المشغل ## سلسلة بين Visual C ++، ودول مجلس التعاون الخليجي
-
05-07-2019 - |
سؤال
وأواجه ماكرو مثل هذا (ليس بالضبط، ولكن وظيفة ما يعادل جدا):
#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 الرموز لا تفصل بينها المسافات - كما هو الحال في المثال الخاص بك
.دول مجلس التعاون الخليجي ج المعالج مستندات أ >:
<اقتباس فقرة>ولكن، واثنين من الرموز التي لا تشكل معا عربون صحيح لا يمكن لصق معا.
اقتباس فقرة>وstructure.member ليس رمز واحد.
في هذه الحالة لا تحتاج إلى استخدام عامل التشغيل ## (سلسلة رمزية). يمكنك فقط إزالته. هنا مثال اختبار مع دول مجلس التعاون الخليجي 4.2.4 على لينكس:
#include <stdio.h>
#define STRUCTMEMBER(Member, Value) GlobalStructInstance.Member = Value
struct {
const char* member1;
}GlobalStructInstance;
int main(void)
{
STRUCTMEMBER(member1, "Hello!");
printf("GlobalStructInstance.member1 = %s\n",
GlobalStructInstance.member1);
return 0;
}