#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
'programing' 카테고리의 다른 글
스프링 부트 응용 프로그램:유형의 반환 값에 대한 변환기를 찾을 수 없습니다. (0) | 2023.07.18 |
---|---|
ASP.NET 라우팅을 사용하여 정적 파일 제공 (0) | 2023.07.18 |
각도 형식(반응성이 아님)의 데이터가 변경되었는지 감지 (0) | 2023.07.18 |
PDB 중단점을 파이썬 코드에 넣는 더 간단한 방법은 무엇입니까? (0) | 2023.07.18 |
주피터 노트북에서 마크다운 출력을 프로그래밍 방식으로 생성하는 방법은 무엇입니까? (0) | 2023.07.18 |