الماكرو الذي يطبع تعبيرًا ويقيمه (مع __string)

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

  •  22-08-2019
  •  | 
  •  

سؤال

للتعلم والإظهار ، أحتاج إلى ماكرو يطبع معلمه و يقيمها. أظن أنها حالة شائعة للغاية ، قد تكون حتى أسئلة وأجوبة ولكن لا يمكنني العثور على مراجع فعلية.

الكود الحالي الخاص بي هو:

#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", __STRING(expr), (expr)))

وثم:

PRINT(x & 0x01);

إنه يعمل بشكل جيد ، لكنني لست متأكدًا من الوضع القانوني للماكرو __string ، خاصة لأنه في مساحة الاسم الخاصة __.

لذلك ، أسئلتي:

  1. هل هناك طريقة أفضل لكتابة هذا الماكرو؟
  2. هل __string قياسي/عظيم/شرير؟
  3. كيفية استخدام أدوات البحث الحالية للعثور على __string؟ So's Search Engine يبحث فقط عن أي شيء يحتوي على سلسلة :-(
هل كانت مفيدة؟

المحلول

يمكنك استخدام الرمز المسبق # preprocessor الذي يحول وسيطة RHS إلى سلسلة حرفية:

#include <stdlib.h>
#include <stdio.h>

#define STR(x) #x
#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", STR(expr), (expr)))

int main(void)
{
    int x = 7;

    PRINT(x & 0x01);

    return EXIT_SUCCESS;
}

2) إنها بالتأكيد ليست قياسية ، وهذه هي المرة الأولى التي صادفتها ؛ ليس من المستغرب لأنه لا يبدو أنه يفعل أكثر بكثير من ماكرو STR () أعلاه ، للوهلة الأولى.

3) جوجل يبدو أنه يعمل بشكل جيد.

نصائح أخرى

شيء مثل

#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", #expr, (expr)))

ربما ما تريد. # هو مشغل التسلسل.

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