Trên trang giới thiệu Boost.Preprocessor, một ví dụ được đưa ra trong A.4.1.1 ngang Lặp
#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
Giải thích được cung cấp dưới đây:
Quá trình sinh mã được khởi động bằng cách gọi BOOST_PP_REPEAT
, một số bậc cao hơn nhiều lần gọi macro được đặt tên theo đối số thứ hai của nó (TINY_size
). Đối số đầu tiên xác định số lượng lời gọi lặp lại, và đối số thứ ba có thể là bất kỳ dữ liệu nào; nó được truyền trên không thay đổi cho macro đang được gọi. Trong trường hợp này, TINY_size
không sử dụng dữ liệu đó, do đó, lựa chọn để vượt qua ~
là tùy ý. [5]
(tôi nhấn mạnh)
Và đó là lưu ý:
[5]
~
không phải là một lựa chọn hoàn toàn tùy ý. Cả hai @
và $
có thể là lựa chọn tốt, ngoại trừ việc chúng về mặt kỹ thuật không phải là một phần của bộ ký tự cơ bản mà việc triển khai C++ được yêu cầu để hỗ trợ. Một số nhận dạng như bị bỏ qua có thể bị mở rộng macro, dẫn đến kết quả không mong muốn.
Dấu ngã, do đó, chỉ đơn giản là trình giữ chỗ vì cần có đối số nhưng không cần thiết. Vì bất kỳ định danh do người dùng định nghĩa wannabe có thể được mở rộng, bạn cần phải sử dụng một cái gì đó khác.
Nó chỉ ra rằng ~
là khá nhiều không sử dụng (phủ định nhị phân không phải là thường được gọi là) so với +
hoặc -
ví dụ, vì vậy có rất ít cơ hội của sự nhầm lẫn.Khi bạn đã giải quyết vấn đề này, hãy sử dụng nó một cách nhất quán sẽ mang lại cho nó mới ý nghĩa đối với dấu ngã; như sử dụng operator<<
và operator>>
để phát trực tuyến dữ liệu đã trở thành thành ngữ C++.
đó là đối số giả – Anycorn
~ là phần bổ sung bitwise, như bạn có thể đã biết. Có vẻ như chỉ là một trình giữ chỗ cho tôi. Tôi không nghĩ nó có ý nghĩa đặc biệt nào cả. –