2014-10-01 16 views
7

Có cách nào trong C để tạo chuỗi ký tự từ một ký tự bằng chữ, sử dụng macro không?macro: chuỗi chữ từ char literal

ví dụ tôi có

'a' 

và tôi muốn tạo ra các chuỗi chữ

"a" 

Để làm rõ câu hỏi:

#define A 'a' 

write(fd, "x=" CHAR2STRING(A) "\n", 4); 

Câu hỏi của tôi là làm thế nào để xác định macro CHAR2STRING

+0

Một macro nội tuyến? (không có tuyên bố var)? Tôi tò mò là tốt, vì một là hai char 'rộng, khác là một. Nơi bạn có thể đề nghị * char * thứ hai (terminator) được lưu trữ? Thậm chí không đi đến một đánh giá như một địa chỉ, mà vẫn sẽ cần phải được giải quyết. – WhozCraig

+1

@WhozCraig - Nó sẽ được đánh giá tại thời gian biên dịch. Tôi hy vọng nó sẽ được lưu trữ theo cùng một cách như nếu tôi đã sử dụng "một" trực tiếp trong mã của tôi (và không được hướng dẫn trình biên dịch để tạo ra nó). – martinkunev

+0

Sau đó, tôi không nhìn thấy nó xảy ra, nhưng tôi sẽ thực sự tò mò nếu ai đó đến với một cách làm như vậy. (quá muộn, và ngoài cà phê để tôi có thể bôi lên nó ngay bây giờ). – WhozCraig

Trả lời

2

-Summary các ý kiến ​​để gian hỏi

này dường như không thể đạt được. Là một thay thế, chuỗi chữ có thể được xác định và một macro STRING2CHAR được viết thay vì:

#define A "a" 
#define STRING2CHAR(s) (*(s)) 
write(fd, "x=" A "\n", 4); 
putchar(STRING2CHAR(A)); 

hoặc

#define A a 
#define XSTR(s) #s 
#define SYM2CHAR(sym) (*XSTR(sym)) 
#define SYM2STRING(sym) XSTR(sym) 

Khái niệm *"a" không phải là một hằng số thời gian biên dịch (do đó ví dụ như nó có thể không được được sử dụng làm bộ khởi tạo cho đối tượng có thời lượng lưu trữ không tự động, độ dài mảng không phải VLA, nhãn case hoặc chiều rộng trường bit), mặc dù trình biên dịch có thể đánh giá nó ở thời gian biên dịch (được kiểm tra bằng Gcc và Kêu vang).


đề nghị bởi M OehmMatt McNabb.

0

Không rất thanh lịch, nhưng nó hoạt động:

#define STRING_ME(tgt, ch) tgt[0]=ch;tgt[1]='\0' 

Giả tgt có không gian cho 2 ký tự. Có lẽ bạn có thể đưa ra một ví dụ những gì bạn muốn nó trông như thế nào?

+1

@mafso: Đúng, nhưng câu trả lời có trước ví dụ, được thêm vào sau để làm rõ. –

0

Bạn có thể làm

#define A 'a' 
#define X(macro) #macro 
#define CHAR2STRING(macro) X(macro) 

printf("%s\n", CHAR2STRING(A)); 

bạn sẽ nhận được 'a' thay vì một, nhưng có lẽ đó là ok cho bạn.

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