"؟؟" يتم تحويله إلى "^" في Visual C ++. لماذا يحدث وما هو الطريق؟

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

  •  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 ++؟

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