2012-02-01 38 views
9

Có thể ghép chuỗi từ một macro khác khi #bao gồm tên tệp (trong C) hay không. Ví dụ,Chuỗi ghép trong C#include filename

tôi có,

#define AA 10 
#define BB 20 

đây là những thông số mà thay đổi theo chương trình chạy

Và các tập tin bao gồm:

#include "file_10_20" // this changes correspondingly i.e. file_AA_BB 

Có thể có cái gì đó như #include "file_AA_BB" bằng cách nào đó ? Tôi googled để thấy rằng nhà điều hành pound đôi có thể concat dây nhưng không thể tìm thấy một cách để làm điều đó.

Mọi trợ giúp sẽ được đánh giá cao.

+0

thử '#include # (tệp _ ## AA ## _ ## BB)' – asaelr

Trả lời

16

Trước tiên tôi nghĩ "đó là dễ dàng", nhưng nó đã làm mất một vài cố gắng để tìm ra:

#define AA 10 
#define BB 20 

#define stringify(x) #x 
#define FILE2(a, b) stringify(file_ ## a ## _ ## b) 
#define FILE(a, b) FILE2(a, b) 

#include FILE(AA, BB) 

Theo yêu cầu, tôi sẽ cố gắng giải thích. FILE(AA, BB) mở rộng thành FILE2(AA, BB) nhưng sau đó AABB được mở rộng trước FILE2, vì vậy mở rộng tiếp theo là FILE2(10, 20) mở rộng thành stringify(file_10_20) trở thành chuỗi.

Nếu bạn bỏ qua FILE2, bạn sẽ kết thúc với stringify(file_AA_BB) sẽ không hoạt động. Tiêu chuẩn C thực sự dành một số trang xác định cách mở rộng macro được thực hiện. Theo kinh nghiệm của tôi, cách tốt nhất để suy nghĩ là "nếu không có đủ mở rộng, hãy thêm một lớp khác là define"

Chỉ một cách nghiêm ngặt sẽ không hoạt động do # được áp dụng trước khi AA được thay thế bằng 10. Đó là cách bạn thường muốn nó thực sự, ví dụ:

#define debugint(x) warnx(#x " = %d", x) 
debugint(AA); 

sẽ in

AA = 10 
+0

Nếu bạn có thể giải thích cho tôi lý do tại sao FILE macro là cần thiết, tôi sẽ upvote ;-). Tôi đã nhìn thấy nhiều cấu trúc như vậy đã và không bao giờ hiểu tại sao chỉ 2 macro không hoạt động hoặc thậm chí lý do tại sao câu trả lời của asael không hoạt động. Tôi rất quan tâm đến việc biết cách xử lý tiền xử lý trong ví dụ của bạn. Ai đó có thể giải thích? – Artur

+1

Đừng quên #undef TẬP_TIN, vì nó sẽ va chạm với một cái gì đó trong wildplasser

+0

Phải, có lẽ không phải là lựa chọn tốt nhất của tên macro. –

5

nó thường được sử dụng như thế này:

#define stringify(x) #x 
#define expand_and_stringify(x) stringify(x) 

#define AA 10 
#define BB 20 

#define TEXT1 "AA = " stringify(AA) " BB = " stringify(BB) 
#define TEXT2 "AA = " expand_and_stringify(AA) " BB = " expand_and_stringify(BB) 

TEXT1 = "AA = AA BB = BB" 
TEXT2 = "AA = 10 BB = 20" 

Được gọi là xâu chuỗi. Bạn nên kiểm tra this answer.

+0

Điều này không có nghĩa vụ phải làm việc cho một tuyên bố bao gồm? Xem http://stackoverflow.com/questions/20524491/preprocessor-concatenation-for-include-path/20524959#20524959 và http://stackoverflow.com/questions/39038867/string-concatenation-for-include-path – Antonio

Các vấn đề liên quan