>백엔드 개발 >C++ >매크로 확장 순서가 C와 C의 문자열화에 어떤 영향을 미칩니까?

매크로 확장 순서가 C와 C의 문자열화에 어떤 영향을 미칩니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-25 17:24:10457검색

How Does Macro Expansion Order Affect Stringification in C and C  ?

문자열화: 매크로 확장 프로세스 이해

C 및 C 영역에서 "문자열화"라는 용어는 매크로 인수를 문자열 리터럴로 변환하는 것을 의미합니다. . 그러나 다음 시나리오에서 볼 수 있듯이 프로세스가 복잡할 수 있습니다.

#define foo 4
#define str(s) #s

이 경우 문자열화 프로세스(# 연산자)가 매크로보다 먼저 실행되기 때문에 str(foo)는 "foo"를 출력합니다. 확장(#define 지시어). 이렇게 하면 foo가 매크로 이름으로 유지되고 해당 값으로 대체되지 않습니다.

그러나 다음 코드 조각은 다른 결과를 생성합니다.

#define xstr(s) str(s)
#define str(s) #s
#define foo 4

xstr(foo)가 호출되면 출력은 "4"가 됩니다. 이 동작을 이해하려면 매크로 확장의 복잡성을 자세히 조사해야 합니다.

C 및 C 표준에 따르면 매크로 확장 프로세스에는 다음 단계가 포함됩니다.

  1. 식별 및 처리 # 또는 ##(문자열화 연산자)이 앞에 오는 토큰.
  2. 매크로를 해당 매크로 정의로 대체하세요. 인수.
  3. 각 함수 매개변수를 매크로 대체 결과로 바꿉니다.
  4. 추가 매크로에 대한 코드를 다시 검색합니다.

xstr(foo)의 경우 :

  1. xstr 매크로에는 문자열화가 필요하지 않습니다(단계 1).
  2. foo는 값 4로 대체됩니다(2단계).
  3. str 매크로 내에서 s는 4로 대체되어 str(4)가 됩니다(3단계).
  4. str(4)가 다시 스캔되어 "4"(최종 단계).

여기서 중요한 차이점은 매크로 인수가 대체되는 단계(2단계)에 있습니다. 첫 번째 예에서 str(foo)를 사용하면 1단계에서 문자열화가 적용된 후 2단계가 발생합니다. 따라서 foo는 대체되지 않고 출력은 "foo"로 유지됩니다.

이 문제를 해결하기 위해 도우미 매크로 xstr이 사용됩니다. 매크로를 중첩하면 먼저 2단계에서 인수 대체를 수행한 다음 1단계에서 문자열화를 적용하여 원하는 결과 "4"를 얻을 수 있습니다.

위 내용은 매크로 확장 순서가 C와 C의 문자열화에 어떤 영향을 미칩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.