Thắc mắc về token pasting (##) trong C++

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 ạ?

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
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?