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
'programing' 카테고리의 다른 글
Vue Js 단락이 -> OK로 표시되지만 체크박스가 작동하지 않음 (0) | 2022.06.22 |
---|---|
vue.js 2 앱에서 커스텀 데코레이터를 글로벌하게 사용하려면 어떻게 해야 합니까? (0) | 2022.06.22 |
예외 코드 "EXC_I386_GPFLT"의 의미는 무엇입니까? (0) | 2022.06.22 |
로그인 상태를 확인하고 로그인하지 않은 경우 오버레이를 렌더링하고 로그인에 성공하면 계속합니다. (0) | 2022.06.22 |
Ubuntu에서 Android Studio를 설치할 수 없습니다. (0) | 2022.06.21 |