Tôi đang làm việc trên một dự án mà tôi có nhiều chuỗi liên tục được tạo thành bằng cách nối (số, v.v.).Làm thế nào để chuyển đổi chuỗi nối với rộng-char với tiền xử lý C?
Ví dụ, tôi có một vĩ mô LOCATION
rằng định dạng __FILE__
và __LINE__
thành một chuỗi mà tôi có thể sử dụng để biết tôi đang ở đâu trong các mã, khi in các thông điệp hoặc lỗi:
#define _STR(x) # x
#define STR(x) _STR(x)
#define LOCATION __FILE__ "(" STR(__LINE__) ")"
Vì vậy, đây sẽ định dạng một vị trí như "file.cpp (42)". Vấn đề là khi tôi cố gắng để chuyển đổi kết quả vào một rộng chuỗi:
#define _WIDEN(x) L ## x
#define WIDEN(x) _WIDEN(x)
#define WLOCATION WIDEN(LOCATION)
này chỉ hoạt động tốt với GCC, và kết quả là L "file.cpp (42)" được chèn vào trong mã của tôi. Tuy nhiên, khi cố gắng này với MSVC++ (sử dụng Visual C++ 2008 Express), tôi nhận được một lỗi:
error: Concatenating wide "file.cpp" with narrow "("
Tôi hiểu rằng tiền tố L
được thêm vào chỉ đối với nhiệm kỳ đầu tiên trong biểu hiện của tôi. Tôi cũng đã thử điều này:
#define _WIDEN(x) L ## #x
Những "tác phẩm", nhưng cung cấp cho chuỗi L"\"file.cpp\" \"(\" \"42\" \")\""
đó rõ ràng không phải là rất thuận tiện (và không phải những gì tôi đang tìm kiếm), đặc biệt là xem xét rằng macro này là đơn giản so với khác macro.
Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể làm cho nó áp dụng cho toàn bộ biểu thức trong MSVC++, vì vậy tôi có thể nhận được cùng một kết quả tôi nhận được với GCC? Tôi không muốn tạo một chuỗi thứ hai với các mã thông báo toàn diện, bởi vì sau đó tôi sẽ phải duy trì hai macro cho mỗi thẻ, điều này không thuận tiện và có thể dẫn đến lỗi. Thêm vào đó, tôi cũng cần phiên bản thu hẹp của mỗi chuỗi, vì vậy, việc sử dụng các chuỗi toàn bộ không phải là một tùy chọn.
Đó là công việc, mặc dù nó là một loại cú pháp khó xử và có rất nhiều chi phí ... nhưng nó hoạt động và tôi không phải duy trì nhiều macro. Hy vọng rằng, Microsoft sẽ cập nhật tiền xử lý của nó để hỗ trợ nhiều tính năng C99 hơn, mọi thứ sẽ đơn giản hơn nhiều theo cách này. Cảm ơn! –