هل يمكن استخدام الماكرو للوصول للقراءة فقط إلى متغير؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

هل يمكنك تحديد ماكرو يصل إلى متغير عادي، ولكن بطريقة القراءة فقط (بخلاف تعريفه كاستدعاء لوظيفة)؟على سبيل المثال، هل يمكن تعريف الماكرو VALUE في التعليمة البرمجية التالية بطريقة تتسبب فيها الدالة dostuff() في حدوث خطأ في الترجمة؟

struct myobj {
  int value;
}

/* This macro does not satisfy the read-only requirement */
#define VALUE(o) (o)->value

/* This macro uses a function, unfortunately */
int getvalue(struct myobj *o) { return o->value; }
#define VALUE(o) getvalue(o)

void dostuff(struct myobj *foo) {
   printf("The value of foo is %d.\n", VALUE(foo)); /* OK */
   VALUE(foo) = 1; /* We want a compile error here */
   foo->value = 1; /* This is ok. */
}
هل كانت مفيدة؟

المحلول

إذا كان المتغير رقميًا دائمًا، فهذا يعمل:

#define VALUE(x) (x+0)

أو في سياق المثال الخاص بك،

#define VALUE(x) (x->value+0)

نصائح أخرى

حسنًا ، لقد توصلت إلى واحد:

#define VALUE(o) (1 ? (o)->value : 0)

انظر §6.5.17 في معيار C (C99 وC1x):"لا ينتج عن عامل الفاصلة قيمة."

#define VALUE(x) (0, x)

(غير محمول على C++.)

يحاول

#define VALUE(o) (const int)((o)->value)

هل هذا لغز أم أنها مهمة هندسية؟إذا كانت مهمة هندسية، فهناك طرق أفضل للحصول على عتامة الهياكل في لغة C.في هذه المقالة المدونة, لقد كتبت وصفًا لائقًا بما فيه الكفاية لكيفية القيام بذلك في لغة C.

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