كيفية جعل سلسلة شار من قيمة ماكرو C على ذلك؟

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

  •  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

هنا

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