-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 Oehm và Matt McNabb.
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
@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
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