IT

C / C ++ 매크로 링크 연결

lottoking 2020. 8. 14. 08:02
반응형

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

반응형