2010-01-08 20 views
7

Mam program w C poniżej:Co oznacza ## dla preprocesora C (C++)?

#define f(g,g2) g##g2 
main() 
{ 
int var12=100; 
printf("%d",f(var,12)); 
} 

gdy uruchamiam tylko preprocesor Rozszerza to jako

{ 
int var12=100; 
printf("%d",var12); 
} 

co jest powodem, dla którego wyjście jest 100.

Can ktoś mi powiedzieć, jak/dlaczego preprocesor rozszerza var##12 to var12?

+6

Bo to właśnie oznacza "##" w preprocesorze C. To tak, jakby powiedzieć "dlaczego' i ++ 'inkrementuje' i'? ". Ponieważ standard C tak mówi! –

+0

-1 wyraźnie zadanie domowe. – richo

+2

@Richo .... nie jest to praca domowa. Nie znam się dobrze na preprocesorze. Miałem to pytanie w głowie. To może być dla ciebie łatwe i może wyglądać jak praca domowa. Ale dla tych, którzy robią ". Wiem, że nie jest to łatwe do zrozumienia. – Vijay

Odpowiedz

4

ponieważ ## jest wyrazem operator konkatenacji dla preprocesora C.

A może nie rozumiem pytania.

+1

Łączy tokeny, a nie ciągi. –

3

## jest Token Pasting Operator

Podwójne numer znak lub „znak wklejenie” operatora (##), który jest czasami nazywany „łączą” operatora jest stosowane zarówno obiekt jak i funkcji podobne do makr. Pozwala on na łączenie oddzielnych tokenów w jeden token i dlatego nie może być pierwszym lub ostatnim tokenem w definicji makra.

Jeśli przed wprowadzeniem lub zakończeniem formalnego parametru w makrze poprzedzony jest operator wklejający token, parametr formalny jest natychmiast zastępowany przez nierozwinięty faktyczny argument. Ekspansja makro nie jest wykonywana na argumentie przed zamianą.

1

#define f(g,g2) g##g2

## jest usued do łączenia dwóch makr c-preprocesor. Tak więc przed kompilacją f (var, 12) należy zastąpić preprocesorem zmienną12, a tym samym uzyskać wyjście.