programing

C 매크로 값에서 char 문자열을 만드는 방법

prostudy 2022. 6. 22. 21:35
반응형

C 매크로 값에서 char 문자열을 만드는 방법

예를 들어 '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)

수줍음* 많은 분이 당신에게 대답의 싹을 주었지만, 단지 싹만 주셨습니다.C 프리프로세서에서 값을 문자열로 변환하는 기본 기술은 실제로 '#' 연산자를 사용하는 것이지만 제안된 솔루션의 단순한 변환에서는 다음과 같은 컴파일 오류가 발생합니다.

#define TEST_FUNC test_func
#define TEST_FUNC_NAME #TEST_FUNC

#include <stdio.h>
int main(void)
{
    puts(TEST_FUNC_NAME);
    return(0);
}

구문 오류가 'puts()' 행에 있습니다. 문제는 소스의 'stray #'입니다.

C 표준의 섹션 6.10.3.2, '# 연산자'에는 다음과 같이 기술되어 있다.

함수형 매크로의 치환 리스트 내의 # 전처리 토큰은 각각 치환 리스트의 다음 전처리 토큰으로서 파라미터 뒤에 와야 합니다.

문제는 매크로 인수를 문자열로 변환할 수 있지만 매크로 인수가 아닌 임의의 항목은 변환할 수 없다는 것입니다.

따라서 원하는 효과를 얻기 위해서는 반드시 추가 작업을 해야 합니다.

#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의 이름은 'Shy'를 이름의 일부로 사용했습니다.

@Jonathan Leffler:감사합니다.솔루션은 유효합니다.

완전한 작업 예:

/** 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;
}

레퍼런스:Wikipedia의 C 프리프로세서 페이지

#define TEST_FUN_NAME #FUNC_NAME

여기를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/195975/how-to-make-a-char-string-from-a-c-macros-value

반응형