C / C ++ 매크로 링크 연결
#define STR1 "s"
#define STR2 "1"
#define STR3 STR1 ## STR2
STR3 == "s1"을 연결하는 것이 가능합니까? args를 다른 매크로 함수에 전달하여이를 수행 할 수 있습니다. 그러나 어디에 있습니까?
둘 다 공유이면 다음과 같이 할 수 있습니다.
#define STR3 STR1 STR2
전처리는 자동으로 연결됩니다.
편집하다 :
아래에서 언급했듯이 연결을 수행하는 것은 전처리 기가 아니라 컴파일러입니다.
"s" "1"은 유효한 전 처리기 토큰이 아니기 때문에 어쨌든 작동하지 않습니다.
[편집 : 안타깝게도 여러 개의 찬성표를받은 아래의 잘못된 것 ""Just for the record "주석에 대한 응답으로 위의 설명을 반복하고 프로그램 조각이
#define PPCAT_NX(A, B) A ## B
PPCAT_NX("s", "1")
gcc의 전처리 단계에서 다음 오류 메시지를 생성합니다. 오류 : ""s ""및 ""1 ""붙여 넣기는 유효한 전처리 토큰을 제공하지 않습니다.
]
그러나 일반적인 토큰에는 넣기의 경우 다음을 시도하십시오.
/*
* Concatenate preprocessor tokens A and B without expanding macro definitions
* (however, if invoked from a macro, macro arguments are expanded).
*/
#define PPCAT_NX(A, B) A ## B
/*
* Concatenate preprocessor tokens A and B after macro-expanding them.
*/
#define PPCAT(A, B) PPCAT_NX(A, B)
그런 다음 예를 들어 모두 PPCAT_NX(s, 1)
및 PPCAT(s, 1)
식별자를 생성합니다 . 로 정의 매크로 s1
되지 않은 s
경우 .PPCAT(s, 1)
<macro value of s>1
주제에서 계속되는 것은 다음 매크로입니다.
/*
* Turn A into a string literal without expanding macro definitions
* (however, if invoked from a macro, macro arguments are expanded).
*/
#define STRINGIZE_NX(A) #A
/*
* Turn A into a string literal after macro-expanding it.
*/
#define STRINGIZE(A) STRINGIZE_NX(A)
그때,
#define T1 s
#define T2 1
STRINGIZE(PPCAT(T1, T2)) // produces "s1"
대조적으로
STRINGIZE(PPCAT_NX(T1, T2)) // produces "T1T2"
STRINGIZE_NX(PPCAT_NX(T1, T2)) // produces "PPCAT_NX(T1, T2)"
#define T1T2 visit the zoo
STRINGIZE(PPCAT_NX(T1, T2)) // produces "visit the zoo"
STRINGIZE_NX(PPCAT(T1, T2)) // produces "PPCAT(T1, T2)"
힌트 : STRINGIZE
위 의 매크로는 멋지지만 실수하고 인수가 매크로가 경우 (이름에 오타가 아닌 #include
경우 파일을 잊은 경우 ) 컴파일러는 의도 된 매크로 이름을 오류가없는 경우에 있습니다.
인수 STRINGIZE
가 항상 성능이있는 C 값을 가진 경우
#define STRINGIZE(A) ((A),STRINGIZE_NX(A))
한 번 확장하고 유효성을 확인하고 폐기합니다.
대신 ... 내가 포함하지 않은 STRINGIZE(ENOENT)
것처럼 끝나는 이유 를 알아내는 데 시간이 좀 걸렸 습니다 ."ENOENT"
"2"
errno.h
참고 URL : https://stackoverflow.com/questions/5256313/cc-macro-string-concatenation
'IT' 카테고리의 다른 글
함수가 생성자로 호출 감지하는 방법은 무엇입니까? (0) | 2020.08.14 |
---|---|
Python에서 다른 목록으로해야 할 일이 있습니까? (0) | 2020.08.14 |
잡히지 않은 TypeError : undefined는 jquery-min.js로드시 함수가 아닙니다. (0) | 2020.08.14 |
Mac OS X Leopard 키 바인딩의 Emacs (0) | 2020.08.14 |
Django에서 다른 설정으로 단위 테스트하는 방법은 무엇입니까? (0) | 2020.08.14 |