سؤال

دون الذهاب إلى تفاصيل gory أريد استخدام #define ماكرو الذي سوف يتوسع إلى #include لكن علامة "#" مربكة في Preprocessor (كما تعتقد أنني أريد أن أقتبس حجة.)

على سبيل المثال، أريد أن أفعل شيئا مثل هذا:

#define MACRO(name) #include "name##foo"

واستخدامها وهكذا:

MACRO(Test)

والتي سوف تتوسع إلى:

#include "Testfoo"

تضم علامة # المتواضعة المسبق في Preprocessor إلى بارف. Mingw يعطيني الخطأ التالي:

'#' is not followed by a macro parameter

أعتقد أنني بحاجة إلى الهروب من علامة # لكنني لا أمكن إذا كان ذلك ممكنا.

نعم، وحدات الماكرو هي بالفعل الشر ...

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

المحلول

بقدر ما أتذكر أنه لا يمكنك استخدام توجيه آخر مسبق آخر في تحديد.

نصائح أخرى

هو - هي يكون من الممكن إدراج رمزية تجزئة في مجرى الرمز المميز مسبقا. يمكنك أن تفعل ذلك على النحو التالي:

#define MACRO(hash, name) hash include name
MACRO(#,"hello")

-Expands إلى:

# include "hello"

ومع ذلك, ، يستبعد المعيار صراحة أي تحليل إضافي لهذه السطر لوجود توجيهات مسبق [CPP.RESCAN]:

لا يتم معالجة تسلسل الرمز المميز المسبق تماما مسبق استبدال الماكرو كإوجيه مسبق مسبق التوجيه حتى لو كان يشبه واحد.

المشكلة لا تحصل في الواقع على رمز # في إخراج ما قبل Preprocessor.

يبدو أنك تريد أن يقوم Preprocessor بإعادة ترويض ملفك، للتعامل مع توجيهات #include تم إنشاؤها حديثا كجزء من التوسع الكلي. لا يعمل بهذه الطريقة. إذا كان السطر يبدأ مع #، فهذا تعليمات للمصور المسبق وتفسيره. إذا لم يبدأ خط مع #، فهو يخضع فقط للتحول مسبقا بما في ذلك استبدال الماكرو. هذا اختبار مرة واحدة لكل خط.

MACRO(Test)

لا يبدأ مع #. لذلك لا يتم تفسيره على أنه توجيه مسبق؛ بدلا من ذلك يخضع لقواعد استبدال الماكرو.

هذا لأن # لديه معنى خاص عند استخدامه في ماكرو.

#  means quote the following token (which should be a macro parameter name)
## means concatenate the preceding and following tokens.

في وضعك، لا يتبع # الرمز المميز المناسب. لذلك في وضعك، نحتاج إلى الذهاب إلى مستوى من غير مباشر:

#define     QUOTE(name)     #name
#define     TEST(name)      QUOTE(name ## foo)

#include TEST(scot)

لا يمكنك القيام بذلك. يتم الاعتراف بتوجيهات مسبقا قبل توسيع الماكرو؛ إذا كان الماكرو يتوسع إلى شيء يشبه توجيه مسبق، فلن يتم التعرف على هذا التوجيه. أفضل ما يمكنك القيام به هو إنشاء ماكرو لاسم الملف:

#define MACRO(name) "name##foo"
...
#include MACRO(Test)

هذه ربما العمل (يعمل من أجل العادية #define وحدات الماكرو مع عدم وجود معلمات، لكنني لم اختبرها مع وحدات الماكرو مع المعلمات).

#define MACRO(name) <name##foo>
#include MACRO(Test)
#define HASH_SIGN #
BOOST_PP_CAT(HASH_SIGN, include)
#define PARAM_NAME Param
#define GETNAME_(a) #a
#define GETNAME(a) GETNAME_(a)

int Param;
printf("%s = %i\n", GETNAME(PARAM_NAME), PARAM_NAME);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top