سؤال

أنا الآن على استعداد لتجميع مشروعي مع -std=c99 وأنا مواجهة خطأ أنا لا أفهم للحظة. هذا الخط:

my_type* td = ({ register kmy_type* arg0 asm("eax"); arg0; });

يعطيني الخطأ التالي فقط في C99:

warning: ISO C forbids nested functions
error: syntax error before ‘asm’
error: ‘arg0’ undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
error: for each function it appears in.)
warning: ISO C forbids braced-groups within expressions

أي أدلة مرحب بها لمساعدتي في فهم ما يعنيه هذا. لم أكتب هذا الخط وأنا أيضا لست متأكدا من فهم ما هو غرضه.

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

المحلول

الخط

my_type* td = ({ register my_type* arg0 asm("eax"); arg0; });

يجب الحصول على قيمة في eax التسجيل، تفسيرها كمؤشر، في td عامل. ومع ذلك، فإنه يستخدم الكثير من ملحقات جنو، وخاصة تعبيرات البيان واستخدام هذا asm (تخصيص تسجيل صريح). أقترح عليك التبديل إلى -std = gnu99 (أو ما يسمى). خلاف ذلك، قد ترغب في اللعب مع الشرطة السفلية المزدوجة (على سبيل المثال. asm -> __asm) أو ال __extension__ الكلمة الأساسية، لكنني لا أعرف إذا كان سيساعد في وضع C99.

تحرير: لقد جربتها فقط وتغييرها ببساطة asm ل __asm يعمل.

نصائح أخرى

asm() لا يبدو أن يعمل مع -std=c99. وبعد إنها فكرة سيئة في رأيي، لأن المعيار يشير فعليا إلى أن المترجمين يدعمون asm() الكلمة الأساسية، لكنها ليست إلزامية.

أقترح أنك تستخدم -pedantic في حين أن.

المشكلة لا يوجد ASM، يشبه Arg0

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