كيفية الهروب من الشرطة السفلية في رمز المعالج المسبق C؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

من المفترض أن تأخذ المقتطف التالي قيمة المشروع (المحددة في Makefile) وإنشاء اسم ملف تضمين.على سبيل المثال، إذا كان PROJECT=classifier، فيجب في النهاية إنشاء classifier_ir.h لـ PROJECTINCSTR

أجد أن هذا الرمز يعمل طالما أنني لا أحاول استخدام الشرطة السفلية في اللاحقة.ومع ذلك، فإن استخدام الشرطة السفلية ليس أمرًا اختياريًا - فقاعدة التعليمات البرمجية الخاصة بنا تستخدمها في كل مكان.يمكنني التغلب على هذه المشكلة نظرًا لوجود عدد محدود من قيم PROJECT ولكني أود معرفة كيفية جعل المقتطف التالي يعمل فعليًا، مع الشرطة السفلية.هل يمكن الهروب منه؟

#define PROJECT classifier

#define QMAKESTR(x) #x
#define MAKESTR(x) QMAKESTR(x)
#define MAKEINC(x) x ## _ir.h
#define PROJECTINC MAKEINC(PROJECT)
#define PROJECTINCSTR MAKESTR(PROJECTINC)

#include PROJECTINCSTR

يحرر:يجب أن يحاول المترجم تضمين classifier_ir.h، وليس PROJECT_ir.h.

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

المحلول

#define QMAKESTR(x) #x
#define MAKESTR(x) QMAKESTR(x)
#define SMASH(x,y) x##y
#define MAKEINC(x) SMASH(x,_ir.h)
#define PROJECTINC MAKEINC(PROJECT)
#define PROJECTINCSTR MAKESTR(PROJECTINC)

نصائح أخرى

هذا يعمل بالنسبة لي:

#define QMAKESTR(x) #x
#define MAKESTR(x) QMAKESTR(x)
#define MAKEINC(x) x ## _ir.h
#define PROJECTINC(x) MAKEINC(x)
#define PROJECTINCSTR MAKESTR(PROJECTINC(PROJECT))

#include PROJECTINCSTR

يعمل هذا المثال المجرد مع gcc (v4.1.2) ويحاول تضمين "PROJECT_ir.h"

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