programing

매크로의 타일(~)은 무엇을 의미합니까?

coolbiz 2023. 7. 29. 13:07
반응형

매크로의 타일(~)은 무엇을 의미합니까?

사이트에서 볼 수 있는 코드는 괄호 안에 타일을 사용하여 매크로 호출을 표시합니다.

HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~))
//                                          ^^^

그게 무슨 뜻입니까?나는 그것이 단지 공허한 논쟁이라고 의심하지만, 나는 확신할 수 없습니다.그것은 C(99)에 특정될 수 있습니까?__VA_ARGS__C99에 특이적이고 C++에 존재합니까?

Boost의 소개 페이지에 있습니다.전처리기, 예는 A.4.1.1 수평 반복에 제공됩니다.

#define TINY_print(z, n, data) data

#define TINY_size(z, n, unused)                                 \
  template <BOOST_PP_ENUM_PARAMS(n, class T)>                   \
  struct tiny_size<                                             \
      BOOST_PP_ENUM_PARAMS(n,T)                                 \
      BOOST_PP_COMMA_IF(n)                                      \
      BOOST_PP_ENUM(                                            \
          BOOST_PP_SUB(TINY_MAX_SIZE,n), TINY_print, none)      \
  >                                                             \
    : mpl::int_<n> {};

BOOST_PP_REPEAT(TINY_MAX_SIZE, TINY_size, ~) // Oh! a tilde!

#undef TINY_size
#undef TINY_print

아래에 설명이 나와 있습니다.

코드 생성 프로세스가 호출에 의해 시작됩니다.BOOST_PP_REPEAT두 번째 인수로 명명된 매크로를 반복적으로 호출하는 고차 매크로(TINY_size첫 번째 인수는 반복 호출 횟수를 지정하고 세 번째 인수는 임의의 데이터가 될 수 있습니다. 이 인수는 호출 중인 매크로에 변경되지 않고 전달됩니다.이 경우, 에서는 해당 데이터를 사용하지 않으므로 전달하기 위한 선택은 임의적이었습니다. [5]

(내 것이 아님)

그리고 다음과 같은 메모가 있습니다.

[5] ~완전히 임의적인 선택은 아닙니다.둘다요.@그리고.$기술적으로 C++ 구현이 지원해야 하는 기본 문자 집합의 일부가 아니라는 점을 제외하면 좋은 선택이었을 수 있습니다.무시된 식별자와 같은 식별자는 매크로 확장의 영향을 받아 예기치 않은 결과를 초래할 수 있습니다.

따라서 타일은 인수가 필요하지만 필요하지 않기 때문에 단순히 자리 표시자입니다.원하는 사용자 정의 식별자를 확장할 수 있으므로 다른 것을 사용해야 합니다.

알고 보니~와 비교하여 거의 사용되지 않습니다(부정적인 것은 그렇게 자주 불리지 않습니다).+또는-예를 들어, 혼란의 가능성이 거의 없습니다.일단 이것을 결정하고 나면, 그것을 꾸준히 사용하면 타일에 새로운 의미를 부여합니다; 사용하는 것과 같습니다.operator<<그리고.operator>>스트리밍 데이터는 C++ 관용어가 되었습니다.

~아무것도 하지 않습니다.괄호 안에 있는 거의 모든 내용이 동일하게 작동합니다.

이 속임수의 핵심은 다음과 같은 것을 테스트하는 것입니다._TRIGGER_PARENTHESIS_옆에 있음(~)의 확대에 있어서_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~).어느 쪽이든,HAS_COMMA(...)다음 중 하나로 인수를 확장합니다.0또는1.

테스트할 인수는 매크로와 해당 괄호 사이에 배치되며, 인수가 비어 있는 경우에만 매크로가 트리거됩니다.

_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)

참고: 사실 당신이 올린 바로 그 링크에 그것이 명시되어 있습니다.저는 이것에 대한 참조를 표준에서 확인할 것입니다.

언급URL : https://stackoverflow.com/questions/6478783/what-does-the-tilde-in-macros-mean

반응형