Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Microsoft-specifik
C-makron är ett bekvämt sätt att infoga sammansättningskod i källkoden, men de kräver extra försiktighet eftersom ett makro expanderas till en enda logisk rad. Följ dessa regler för att skapa problemfria makron:
Omslut blocket
__asmi klammerparenteser.Placera nyckelordet
__asmframför varje sammansättningsinstruktion.Använd C-kommentarer i gammal stil (
/* comment */) i stället för kommentarer i sammansättningsformat (; comment) eller C-kommentarer med en rad (// comment).
För att illustrera definierar följande exempel ett enkelt makro:
#define PORTIO __asm \
/* Port output */ \
{ \
__asm mov al, 2 \
__asm mov dx, 0xD007 \
__asm out dx, al \
}
Vid första anblicken verkar de tre __asm sista nyckelorden överflödiga. De behövs dock eftersom makrot expanderas till en enda rad:
__asm /* Port output */ { __asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al }
Det tredje och fjärde __asm nyckelordet behövs som instruktionsavgränsare. De enda instruktionsavgränsare som identifieras i __asm blocken är nyradstecken och __asm nyckelordet. Eftersom ett block som definieras som ett makro är en logisk linje måste du avgränsa varje instruktion med __asm.
Klammerparenteserna är också viktiga. Om du utelämnar dem kan kompilatorn förväxlas med C- eller C++-instruktioner på samma rad till höger om makroanropet. Utan den avslutande klammerparentesen kan kompilatorn inte avgöra var sammansättningskoden stoppas och C- eller C++-instruktioner visas efter __asm blocket som sammansättningsinstruktioner.
Kommentarer i sammansättningsformat som börjar med ett semikolon (;) fortsätter till slutet av raden. Detta orsakar problem i makron eftersom kompilatorn ignorerar allt efter kommentaren, hela vägen till slutet av den logiska raden. Detsamma gäller för C- eller C++-kommentarer med en rad (// comment). Om du vill förhindra fel använder du C-kommentarer i gammal stil (/* comment */) i __asm block som definierats som makron.
Ett __asm block skrivet som ett C-makro kan ta argument. Till skillnad från ett vanligt C-makro kan ett __asm makro dock inte returnera ett värde. Så du kan inte använda sådana makron i C- eller C++-uttryck.
Var noga med att inte anropa makron av den här typen urskillningslöst. Om du till exempel anropar ett sammansättningsspråkmakro i en funktion som deklarerats __fastcall med konventionen kan det orsaka oväntade resultat. (Se Använda och bevara register i infogad sammansättning.)
Avsluta Microsoft Specifik