2016-12-22 32 views
5

Wiem, że jest możliwe, aby przekształcić coś do łańcucha z makro tak:Konwersja ciąg non ciąg z C makro

#define STRING(s) #s 

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

Ale możliwe jest, aby zrobić coś przeciwnego?

#define MyType(type) ??? 

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

Pachnie strasznie jak [problem XY] (http://xyproblem.info). Naprawdę powinieneś ** poprawić swoje pytanie ** (edytując je), aby go zmotywować. Nie mogę sobie wyobrazić przypadku, w którym robienie tego, co chcesz, jest naprawdę przydatne. –

+0

Ale skąd wiadomo, jak przekonwertować go z łańcucha na dowolny typ? Czy zawsze będzie to typ całkowity o pewnej precyzji? A co z zmiennoprzecinką? –

+1

Preprocesor może łączyć ze sobą żetony, ale nie może złamać tokena, więc krótka odpowiedź brzmi NIE. Możesz jednak stworzyć coś, co może zrobić coś podobnego, ale zależy to od przypadku użycia i problemu, ale nie sądzę, że jest to rzecz, której naprawdę potrzebujesz. – ST3

Odpowiedz

4

AFAIK, nie jest to możliwe przy użyciu standardowego preprocesora C. To, czego chcesz, nie jest częścią standardowego języka C11 (lub C99). I żadnej części C++ 11 lub C++ 14 (która jest innym językiem niż C).

Ale możesz użyć innego preprocesora lub jakiegoś skryptu do przekształcenia twojego dziwnego pliku źródłowego w jakiś plik C.

Możesz także dostosować swój kompilator (np. Za pomocą wtyczki GCC lub rozszerzenia MELT), aby dodać takie zachowanie poprzez dodatkowe wbudowane lub pragmy. To byłoby bardzo specyficzne dla kompilatora i prawdopodobnie wymaga więcej pracy niż na to, na co cię stać.

+0

Dla kompletności: C robi dekryfikację jako część '_Pragma'. Ale można tego użyć tylko do sformułowania dyrektyw "# pragma", więc nie pomogłoby to PO. – hvd

+0

Można obliczyć dowolne wartości czasu kompilacji z łańcuchów z boost :: metaparse, więc jest to możliwe. –

+0

Prawdopodobnie nie w ogólnym przypadku. –