Programing

이중 스트링 화 트릭은 정확히 어떻게 작동합니까?

lottogame 2020. 10. 6. 07:44
반응형

이중 스트링 화 트릭은 정확히 어떻게 작동합니까?


적어도 일부 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=c99)에서 작동하지만 C 표준 용어로 어떻게 작동 하는지 잘 모르겠습니다 .

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


예, 보장됩니다.

매크로 인수가 매크로 본문에 stringifier # 또는 token-paster ##와 함께 나타나는 경우를 제외 하고 매크로에 대한 인수 자체가 매크로 확장이기 때문에 작동합니다 .

6.10.3.1/1 :

... 함수형 매크로 호출에 대한 인수가 식별 된 후 인수 대체가 발생합니다. 교체 목록의 매개 변수는 앞에 # 또는 ## 사전 처리 토큰이 있거나 ## 사전 처리 토큰 (아래 참조)이 뒤 따르지 않는 한 그 안에 포함 된 모든 매크로가 확장 된 후 해당 인수로 교체됩니다.

따라서 STR1(THE_ANSWER)STR1의 인수가 매크로 확장이 아니기 때문에 "THE_ANSWER"가 표시됩니다. 그러나, STR2의 인수 이 때문에 STR1의 인자를 제공 STR2의 정의로 치환 때 매크로 확장 42"42"의 결과.


Steve가 언급했듯이 이것은 보장되고 C89 표준 이후로 보장되었습니다.이 표준은 매크로에서 ### 연산자를 코드화 한 표준이었고 다음 과 같은 경우에만 본문에 매크로를 대체하기 전에 args에서 매크로를 반복적으로 확장하도록 요구합니다. 본문은 인수에 # 또는 ##적용하지 않습니다 . 이 점에서 C99는 C89에서 변경되지 않습니다.

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

반응형