2012-11-26 9 views
6

Mam do czynienia z problemem ze zrozumieniem użycia wywołań funkcji makra z instrukcji printf().Makro wywołanie funkcji z instrukcji printf w C

Mam poniższy kod:

#include<stdio.h> 
#define f(g,h) g##h 
main() 
{ 
    printf("%d",f(100,10)); 
} 

Ten kod wyjścia "10010" jako odpowiedź.

Nauczyłem się, że wywołanie funkcji makro po prostu kopiuje kod funkcji makr w miejsce wywołania z zastąpionymi argumentami.

więc kod powinien być jak:

#include<stdio.h> 
#define f(g,h) g##h 
main() 
{ 
    printf("%d",100##10); 
} 

Ale kiedy wykonywane powyższy kod osobno z podstawionym makro, pojawia się błąd kompilacji.

Jak więc pierwszy kod daje 10010 jako odpowiedź, podczas gdy drugi kod podaje błąd kompilacji?

+2

## jest poprawne tylko WEWNĄTRZ Twojego zdania #define i nie ma żadnego efektu, chyba że wiersz zaczyna się od "#define [twoje rzeczy tutaj]", ponieważ "#define" jest tym, co nakazuje kompilatorowi potraktowanie tej części kodować specjalnie. – ActiveTrayPrntrTagDataStrDrvr

+0

'## 'zapewnia, że ​​parametry są łączone. Dlatego: f (100,10) jest zastąpione przez preprocesor w: 10010 – Tomas

Odpowiedz

15

Operator preprocesora konkatenacji ## jest wykonywany przed makro zostało zastąpione. Można go używać tylko w ciałach makro.

+0

Perfect. To wyjaśnia, dlaczego drugi kod nie zadziałał. Dzięki –

1

Operator ## ma znaczenie specjalne dla preprocesora, jest operatorem token-paste, który "skleja" dwa tokeny. Tak więc w twoim przypadku, g i h są "sklejone", tworząc nowy token - int literalny 10010.

1

Istnieje kilka znaków specjalnych, takich jak ## w makrze, które zmieniają regułę "po prostu zastępuje tekst".

Powiązane problemy