2016-12-22 13 views
5

Tôi biết rằng nó có thể chuyển đổi một cái gì đó để chuỗi với vĩ mô như thế này:Chuyển đổi chuỗi để phi chuỗi với C vĩ mô

#define STRING(s) #s 

printf("%s", STRING(i am string)); 

Nhưng nó có thể làm ngược lại?

#define MyType(type) ??? 

MyType("uint16_t") myint = 100; 
+2

Mùi có vẻ như là một vấn đề [XY] (http://xyproblem.info). Bạn thực sự nên ** cải thiện câu hỏi của bạn ** (bằng cách chỉnh sửa nó) để thúc đẩy nó. Tôi không thể tưởng tượng một trường hợp làm những gì bạn muốn thực sự hữu ích. –

+0

Nhưng làm cách nào để biết cách chuyển đổi từ chuỗi thành bất kỳ loại tùy ý nào? Hoặc nó sẽ luôn luôn là một loại số nguyên của một số độ chính xác? Điều gì về điểm nổi? –

+1

Trình xử lý trước có thể nối các thẻ với nhau nhưng không thể ngắt mã thông báo, vì vậy câu trả lời ngắn là KHÔNG. Tuy nhiên bạn có thể tạo ra thứ gì đó tương tự, nhưng nó phụ thuộc vào trường hợp sử dụng và vấn đề của bạn, nhưng tôi không nghĩ đó là thứ bạn thực sự cần. – ST3

Trả lời

4

AFAIK, không thể sử dụng bộ tiền xử lý C chuẩn. Những gì bạn muốn không phải là một phần của ngôn ngữ chuẩn C11 (hoặc C99). Và không phải là một phần của C++ 11 hoặc C++ 14 (mà là một ngôn ngữ khác với C).

Nhưng bạn có thể sử dụng một số bộ tiền xử lý khác hoặc một số tập lệnh để chuyển đổi tệp nguồn kỳ lạ của bạn thành một tệp C.

Bạn cũng có thể tùy chỉnh trình biên dịch của mình (ví dụ: với plugin GCC hoặc phần mở rộng MELT) để thêm hành vi như vậy thông qua các phần bổ sung hoặc pragma bổ sung. Đó sẽ là trình biên dịch rất cụ thể, và có thể đòi hỏi nhiều công việc hơn những gì bạn có thể mua được.

+0

Để hoàn thành: C thực hiện khử chuỗi như là một phần của '_Pragma'. Nhưng điều đó chỉ có thể được sử dụng để tạo thành các chỉ thị '# pragma' vì vậy sẽ không giúp OP. – hvd

+0

Bạn có thể tính toán các giá trị thời gian biên dịch tùy ý từ chuỗi với boost :: metaparse để có thể. –

+0

Có lẽ không phải trong trường hợp chung. –

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