2013-05-16 9 views
5

Chcę przekonwertować stałą ciągu na tokena preprocessing przy użyciu makra. przykład:jak przekonwertować stałą ciągową na token przetwarzania wstępnego w C

 

    // get the first character of marco argument to postfix of new data type. 
    #define TYPE(typename) Prefix ## typename #typename[0] 
    void main() 
    { 
     TYPE(int) a, b, c; // Prefixinti a, b, c; 
     TYPE(float) x, y, z; // Prefixfloatf x, y, z; 
     a = 3; 
    } 

to możliwe C/C++?
p/s: przepraszam za mój biedny angielski.
edytowany

+8

Nie można skrócić łańcucha, a jedynie przeciągnąć. – chris

+0

Ale to powinno być wszystko, czego potrzebujesz, o ile twoja stała nie zawiera przecinków. – Medinoc

+3

Próbowałem bardzo mocno, ale nie mogę się już oprzeć: ** dlaczego to zrobić? ** – WhozCraig

Odpowiedz

0

To nie jest możliwe, nawet z szablonów w C++. Nawiasem mówiąc, unikaj używania "typename" w kodzie C, ponieważ jest to słowo kluczowe w C++, więc twój kod C będzie trudny do przeniesienia.

Również void main() nie jest ściśle przenośny; zamiast tego użyj int main().

+3

'typename' nie robi różnicy, ponieważ preprocesor działa przed kompilatorem. – chris

+0

Prawda, ale nadal niegrzeczna, nie sądzisz? – Bathsheba

1

Należy zawsze pamiętać, co robi preprocesor, modyfikuje kod źródłowy, zanim jeszcze go zobaczy.

To nie skompilować (I usunąć cudzysłowy wokół int), ale nie jest tak przydatny:

#define TYPE(typename) typename 

void main() 
{ 
    TYPE(int) a, b, c; 
    a = 3; 
} 

Co robisz wyniki w następującym kodem wysłanym do kompilatora:

TYPE("int") a, b, c; 

w wyniku "

gdzie po stałej łańcuchowej następuje para niezadeklarowanych identyfikatorów, h powoduje błąd składni

+0

Chcę utworzyć typy danych zdefiniowane przez użytkownika za pomocą X makr. Przykład: W OpenGL. GLPoint3i, GLPoint3f: pobierz pierwszy znak w typie danych (int, float) do postfiksu dla moich typów danych. – dangkhoasdc

+1

Myślę, że zmienne openGL są tworzone za pomocą typedef. zajrzyj na http://en.wikipedia.org/wiki/X_Macro tutaj można zobaczyć, jak korzystać z makra X, – hetepeperfan

3
#define TYPE(first_letter, rest) Prefix ## first_letter ## rest ## first_letter 

typedef int TYPE(i,nt); 
typedef float TYPE(f,loat); 

int main(void) 
{ 
    TYPE(i,nt) a, b, c; // Prefixinti a, b, c; 
    TYPE(f,loat) x, y, z; // Prefixfloatf x, y, z; 
} 
+0

Czy masz lepsze rozwiązanie? Chcę 'TYPE (int) a, b, c; // Prefixiniti a, b, c;' – dangkhoasdc

+0

Nie, nie znam innego rozwiązania. – pmg

Powiązane problemy