ASM في C يعطي خطأ مع -STD = C99
-
09-09-2019 - |
سؤال
أنا الآن على استعداد لتجميع مشروعي مع -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