Vì một ounce kinh nghiệm đáng giá cả tấn lý thuyết, tôi đã thử một chương trình thử nghiệm nhỏ cho MULTILINE
:
#define MULTILINE(...) #__VA_ARGS__
const char *mstr[] =
{
MULTILINE(1, 2, 3), // "1, 2, 3"
MULTILINE(1,2,3), // "1,2,3"
MULTILINE(1 , 2 , 3), // "1 , 2 , 3"
MULTILINE( 1 , 2 , 3 ), // "1 , 2 , 3"
MULTILINE((1, 2, 3)), // "(1, 2, 3)"
MULTILINE(1
2
3), // "1 2 3"
MULTILINE(1\n2\n3\n), // "1\n2\n3\n"
MULTILINE(1\n
2\n
3\n), // "1\n 2\n 3\n"
MULTILINE(1, "2" \3) // "1, \"2\" \3"
};
Biên dịch đoạn này với cpp -P -std=c++11 filename
để tái sản xuất.
Thủ thuật đằng sau #__VA_ARGS__
là __VA_ARGS__
không xử lý dấu phẩy. Vì vậy, bạn có thể chuyển nó cho toán tử xâu chuỗi. Các khoảng trắng ở đầu và cuối được cắt bớt và các khoảng trắng (bao gồm cả dòng mới) giữa các từ được nén thành một khoảng trắng sau đó. Dấu ngoặc cần được cân bằng. Tôi nghĩ rằng những thiếu sót này giải thích lý do tại sao các nhà thiết kế của C ++ 11, mặc dù #__VA_ARGS__
, đã thấy sự cần thiết của chuỗi ký tự thô.