programing

#define 매크로에서 # 기호를 이스케이프하시겠습니까?

stoneblock 2023. 7. 18. 21:28

#define 매크로에서 # 기호를 이스케이프하시겠습니까?

피비린내 나는 세부 사항으로 들어가지 않고, 나는 사용하고 싶습니다.#define다음으로 확장할 매크로#include그러나 '#' 기호는 전처리기를 혼란스럽게 합니다(인수를 인용하고 싶다고 생각하기 때문입니다).

예를 들어, 다음과 같은 작업을 수행합니다.

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

다음과 같이 사용합니다.

MACRO(Test)

확장 대상:

#include "Testfoo"

겸손한 # 기호로 인해 전처리기가 바프됩니다. MinGW에서 다음 오류가 발생합니다.

'#' is not followed by a macro parameter

나는 # 기호를 피해야 한다고 생각하지만 이것이 가능한지조차 모르겠습니다.

네, 매크로는 정말 사악합니다...

미리 처리된 토큰 스트림에 해시 토큰을 삽입할 수 있습니다.다음과 같이 수행할 수 있습니다.

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

—다음을 의미합니다.

# include "hello"

그러나 이 표준은 사전 처리 지침 [cpp.rescan]의 존재에 대한 이러한 라인의 추가 분석을 명시적으로 배제합니다.

결과적으로 완전히 매크로로 대체된 전처리 토큰 시퀀스는 유사하더라도 전처리 지시어로 처리되지 않습니다.

제가 기억하는 한, 당신은 정의에서 다른 전처리기 지시를 사용할 수 없습니다.

문제는 실제로 프리프로세서의 출력에 # 기호가 표시되지 않는 것입니다.

매크로 확장의 일부로 새로 생성된 #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);

언급URL : https://stackoverflow.com/questions/1135822/escaping-a-symbol-in-a-define-macro