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ô.