이중 스트링 화 트릭은 정확히 어떻게 작동합니까?
적어도 일부 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
'Programing' 카테고리의 다른 글
매개 변수가 실제로 Sql 주입을 방지하기에 충분합니까? (0) | 2020.10.06 |
---|---|
암호화 된 Apple iTunes iPhone 백업을 해독하는 방법은 무엇입니까? (0) | 2020.10.06 |
Android WebView 쿠키 문제 (0) | 2020.10.06 |
Virgil Dobjanschi REST 구현 패턴을 구현하는 샘플 Android REST 클라이언트 프로젝트가 필요합니다. (0) | 2020.10.06 |
Intellij IDEA 13 : 리팩터링 주석 및 문자열을 비활성화하려면 어떻게합니까? (0) | 2020.10.06 |