programing

정확히 어떻게 이중 문자열 트릭이 작동할까요?

prostudy 2022. 6. 27. 21:05
반응형

정확히 어떻게 이중 문자열 트릭이 작동할까요?

적어도 일부 C 프리프로세서에서는 매크로를 문자열화하는 다른 함수 매크로에 전달함으로써 매크로의 이름이 아닌 값을 문자열화할 수 있습니다.

#define STR1(x) #x
#define STR2(x) STR1(x)
#define THE_ANSWER 42
#define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */

사용 사례의 예는 다음과 같습니다.

적어도 GCC와 Clang에서는 동작합니다(양쪽 모두-std=c99C표준으로 어떻게 동작하는지는 잘 모르겠습니다.

이 동작은 C99에 의해 보증됩니까?
그렇다면 C99는 어떻게 보증합니까?
그렇지 않은 경우 동작은 어느 시점에서 C-defined에서 GCC-defined로 이행합니까?

네, 확실합니다.

매크로에 대한 인수 자체가 매크로 확장되기 때문에 동작합니다., 매크로 본문에 매크로 인수 이름이 문자열 번호 또는 토큰 페이스터 ##과 함께 표시되는 경우는 제외합니다.

6.10.3.1/1:

... 함수형 매크로의 기동 인수가 특정되면 인수 치환이 이루어집니다.# 또는 ##의 전처리 토큰 앞이나 ##의 전처리 토큰(아래 참조) 뒤에 있는 경우를 제외하고 치환 목록의 파라미터는 포함된 모든 매크로가 확장되면 대응하는 인수로 대체됩니다.

그러니까, 만약 당신이 한다면STR1(THE_ANSWER)STR1의 인수는 매크로 확장되지 않기 때문에 "THE_ANSWER"가 됩니다.그러나 STR2의 인수는 STR2의 정의로 대체될 때 매크로 확장되며, 따라서 STR1은 다음과 같은 인수를 제공합니다.42, 「42」의 결과입니다.

Steve가 지적한 바와 같이, 이것은 C89 표준부터 확립되어 있습니다.이것은 매크로에서 # 연산자와 ## 연산자를 코드화하고, 본문이 # 또는 ##을 인수에 적용하지 않는 경우에만 arg에서 매크로를 재귀적으로 확장하도록 요구하는 표준입니다.이 점에서 C99는 C89와 다르지 않다.

언급URL : https://stackoverflow.com/questions/2751870/how-exactly-does-the-double-stringize-trick-work

반응형