الماكرو الذي يطبع تعبيرًا ويقيمه (مع __string)
-
22-08-2019 - |
سؤال
للتعلم والإظهار ، أحتاج إلى ماكرو يطبع معلمه و يقيمها. أظن أنها حالة شائعة للغاية ، قد تكون حتى أسئلة وأجوبة ولكن لا يمكنني العثور على مراجع فعلية.
الكود الحالي الخاص بي هو:
#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", __STRING(expr), (expr)))
وثم:
PRINT(x & 0x01);
إنه يعمل بشكل جيد ، لكنني لست متأكدًا من الوضع القانوني للماكرو __string ، خاصة لأنه في مساحة الاسم الخاصة __.
لذلك ، أسئلتي:
- هل هناك طريقة أفضل لكتابة هذا الماكرو؟
- هل __string قياسي/عظيم/شرير؟
- كيفية استخدام أدوات البحث الحالية للعثور على __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)))
ربما ما تريد. # هو مشغل التسلسل.
لا تنتمي إلى StackOverflow