وحدات الماكرو C++:معالجة المعلمة (مثال محدد)

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

  •  03-07-2019
  •  | 
  •  

سؤال

أحتاج إلى استبدال

GET("any_name")

مع

String str_any_name = getFunction("any_name");

الجزء الصعب هو كيفية قطع علامات الاقتباس.ممكن؟أيه أفكار؟

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

المحلول

ماذا عن:

#define UNSAFE_GET(X) String str_##X = getFunction(#X);

أو للحماية من مشكلات الماكرو المتداخلة:

#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)

#define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X));

الاستخدام:

SAFE_GET(foo)

وهذا ما تم تجميعه:

String str_foo = getFunction("foo");

النقاط الرئيسية:

  • استخدم ## لدمج معلمات الماكرو في رمز مميز واحد (الرمز المميز => اسم المتغير، وما إلى ذلك)
  • و # لتوحيد معلمة ماكرو (مفيد جدًا عند القيام "بالانعكاس" في C/C++)
  • استخدم بادئة لوحدات الماكرو الخاصة بك، نظرًا لأنها جميعها في نفس "مساحة الاسم" ولا تريد حدوث تعارضات مع أي رمز آخر.(اخترت MLV بناءً على اسم المستخدم الخاص بك)
  • تساعد وحدات الماكرو المجمعة إذا قمت بتداخل وحدات الماكرو، على سبيل المثال.اتصل بـ MLV_GET من ماكرو آخر مع معلمات أخرى مدمجة/مقيدة (حسب التعليق أدناه، شكرًا!).

نصائح أخرى

ونهج واحد ليس على حد تعبير اسم عند استدعاء الماكرو:

#include <stdio.h>

#define GET( name ) \
    int int##name = getFunction( #name );   \


int getFunction( char * name ) {
    printf( "name is %s\n", name );
    return 42;
}

int main() {
    GET( foobar );
}

في الإجابة على سؤالك، لا، لا يمكنك "تجريدها من" علامات الاقتباس في C ++. ولكن كما تبين إجابات أخرى، يمكنك "إضافتها على". منذ كنت سوف يكون دائما العمل مع سلسلة حرفية على أي حال (أليس كذلك؟)، يجب أن تكون قادرا على التبديل إلى طريقة جديدة.

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