매크로의 타일(~)은 무엇을 의미합니까?
이 사이트에서 볼 수 있는 코드는 괄호 안에 타일을 사용하여 매크로 호출을 표시합니다.
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
'programing' 카테고리의 다른 글
테스트 컨테이너, mariadb, 샤딩 구 및 플라이웨이 (0) | 2023.07.29 |
---|---|
Liquibase 업데이트 오류 (0) | 2023.07.29 |
주입된 모의 객체의 메서드에 전달된 인수를 Mockito가 캡처하는 방법은 무엇입니까? (0) | 2023.07.29 |
열려 있는 파일에서 read()를 두 번 호출할 수 없는 이유는 무엇입니까? (0) | 2023.07.29 |
Numpy 배열에서 곱셈 (0) | 2023.07.29 |