Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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