"؟؟" يتم تحويله إلى "^" في Visual C ++. لماذا يحدث وما هو الطريق؟
-
27-09-2019 - |
سؤال
"؟؟" يتم تحويله إلى "^" إذا قمت بتجميع برنامج MN VC ++ وتشغيله
على سبيل المثال
sprintf( ch, "??")
يطبع
^
ولكن إذا قمت بتشغيل نفس الرمز في Turbo C/C ++ ، فلا توجد مشكلة من هذا القبيل. لماذا يحدث على VC ++ على Windows؟
المحلول
??
وحده ليس trigraph, ، رغم ??'
يتوافق مع ^
.
ربما قمت بكتابته هنا مختلفًا عما لديك في الكود ولا يمكنك رؤية الاقتباس الفردي المتخلف في سلسلتك لأنه قريب جدًا من الاقتباس الختامي.
لذلك في الكود ربما لديك:
sprintf( ch, "??'");
نصائح أخرى
هل أنت متأكد من أنها كانت مسبقة مزدوجة وليست مسبقة واحدة؟ إذا كان ذلك؟ "، فأنت واجهت للتو ملف trigraph, ، وهي "ميزة" يجب إزالتها حقًا ، ولكن لا يرجع ذلك إلى عدم ترحيل IBM إلى UTF-8 من EBCDIC. (تم النظر في Trigraphs للإزالة عندما كانت C ++ 0x لا تزال مفتوحة للتغييرات ، ولكن تم حظر الخطوة لإزالة ثلاثية الأبعاد بشدة من قبل IBM وممثليها في لجنة ISO C ++).
ال ??
عادة ما يبدأ التسلسل trigraph ، ولكن التسلسل "؟؟" ليس Trigraph ، لذا لا ينبغي تفسيره على هذا النحو - ربما يكون هناك خطأ في المترجم - بالضبط ما هو الإصدار الذي تستخدمه ، وما هو الكود الدقيق (بما في ذلك الإعلانات المتغيرة)؟
يطبع هذا الرمز "؟؟" في عدة إصدارات من MSVC 6 إلى VS 2010 كما قد تتوقع:
char ch[20];
sprintf( ch, "??");
printf( "%s\n", ch);
ولكن استبدل snprintf()
اصطف مع:
sprintf( ch, "'??'");
ويصبح الإخراج "'^
"(باستثناء VS 2010).
يوضح الاختبار السريع أن VS 2010 يعطل دعم Trigraph افتراضيًا (يطبع "" يطبع "'??'
"في الاختبار الثاني). في VS 2010 ، يجب عليك تمكين دعم Trigraph بشكل صريح باستخدام /Zc:trigraphs
اختيار. لطيف - جيد.
لمزيد من التفاصيل حول ماهية trigraphs ، انظر: الغرض من تسلسل trigraph في C ++؟