كيفية جعل سلسلة شار من قيمة ماكرو C على ذلك؟
-
10-07-2019 - |
سؤال
وعلى سبيل المثال، وكيفية تجنب كتابة "FUNC_NAME" مرتين؟
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME "func_name"
#endif
وأود أن اتبع نقطة واحدة من حكم الحقيقة .
وإصدار C المعالج:
$ cpp --version
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
المحلول
من هو خجول <سوب> * في أعطاك الجرثومية ل<لأ href = " https://stackoverflow.com/a/195980/15168">answer ، ولكن فقط الجرثومية. هذه التقنية الأساسية لتحويل قيمة إلى سلسلة في C قبل المعالج هو في الواقع عن طريق المشغل '#'، ولكن نقل حرفي بسيط من الحل المقترح يحصل على خطأ الترجمة:
#define TEST_FUNC test_func
#define TEST_FUNC_NAME #TEST_FUNC
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
وهذا خطأ لغوي هو على 'يضع ()' خط - المشكلة هي "طائشة # 'في مصدر
.في القسم 6.10.3.2 من مستوى C، "إن # المشغل، فإنه يقول:
<اقتباس فقرة>وكل رمز تجهيزها # في قائمة بديل للمثل وظيفة يجب أن يتبع الماكرو معلمة كما الرمز المميز تجهيزها المقبل في قائمة الاستبدال.
اقتباس فقرة>والمشكلة هي أنه يمكنك تحويل الحجج الكلي للخيوط - ولكن لا يمكنك تحويل العناصر العشوائية التي ليست حجج الكلي
وهكذا، لتحقيق التأثير كنت بعد، لديك بالتأكيد للقيام ببعض العمل الإضافي.
#define FUNCTION_NAME(name) #name
#define TEST_FUNC_NAME FUNCTION_NAME(test_func)
#include <stdio.h>
int main(void)
{
puts(TEST_FUNC_NAME);
return(0);
}
وأنا لست واضحة تماما عن الكيفية التي تخطط لاستخدام وحدات الماكرو، وكيف كنت تخطط لتجنب تكرار تماما. هذا المثال قليلا أكثر تفصيلا قد تكون أكثر إفادة. استخدام ما يعادل الماكرو إلى STR_VALUE هو المصطلح ما هو ضروري للحصول على النتيجة المرجوة.
#define STR_VALUE(arg) #arg
#define FUNCTION_NAME(name) STR_VALUE(name)
#define TEST_FUNC test_func
#define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC)
#include <stdio.h>
static void TEST_FUNC(void)
{
printf("In function %s\n", TEST_FUNC_NAME);
}
int main(void)
{
puts(TEST_FUNC_NAME);
TEST_FUNC();
return(0);
}
<سوب> * وفي وقت كتابة هذا الجواب أولا، SHOOSH الصورة اسم تستخدم 'خجول' كما جزء من الاسم. سوب>
نصائح أخرى
وJonathan يفلر: شكرا لك. الحل يعمل.
وهناك مثال العمل الكامل:
/** compile-time dispatch
$ gcc -Wall -DTEST_FUN=another_func macro_sub.c -o macro_sub && ./macro_sub
*/
#include <stdio.h>
#define QUOTE(name) #name
#define STR(macro) QUOTE(macro)
#ifndef TEST_FUN
# define TEST_FUN some_func
#endif
#define TEST_FUN_NAME STR(TEST_FUN)
void some_func(void)
{
printf("some_func() called\n");
}
void another_func(void)
{
printf("do something else\n");
}
int main(void)
{
TEST_FUN();
printf("TEST_FUN_NAME=%s\n", TEST_FUN_NAME);
return 0;
}
مثال:
$ gcc -Wall -DTEST_FUN=another_func macro_sub.c -o macro_sub && ./macro_sub
do something else
TEST_FUN_NAME=another_func
#include <stdio.h>
#define QUOTEME(x) #x
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME QUOTEME(TEST_FUN)
#endif
int main(void)
{
puts(TEST_FUN_NAME);
return 0;
}
والمرجعي: ويكيبيديا C المعالج صفحة
و#define TEST_FUN_NAME #FUNC_NAME