Chào mọi người, em mới tìm hiểu về Stringize (#) và token pasting (##) operator trong ngôn ngữ C, và thử code xem nó hoạt động như thế nào.
Ở ảnh dưới, dòng 9 sẽ in ra ‘zya’, còn dòng 10 báo lỗi chưa khai báo ‘zyxwhy’.
Còn nếu đổi dòng 10 thành chuoi2(20, 23) thì lại in ra ‘2023’ bình thường.
Vấn đề là gì và sửa lại như thế nào ạ?
Thắc mắc về token pasting (##) trong C++
line 10 sẽ thành cout << zyxwhy << end;
Compiler sẽ hiểu zyxwhy
là variable
Bạn sửa macro chuoi2
thành #b#c
là được, vì hai hằng chuỗi đi liền nhau tự kết lại thành một.
Cách tổng quát là dùng macro trung gian:
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
Tutorial: https://www.decompile.com/cpp/faq/file_and_line_error_string.htm
Stringify được áp dụng trong macro assert()
rất thông dụng.
Còn token-pasting dùng để nối hai macro/chuỗi thành một tên.
1 Like