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.
De flesta av Microsofts rutiner för körningsbibliotek kompileras eller sammanställs, men vissa rutiner implementeras som makron. När en rubrikfil deklarerar både en funktion och en makroversion av en rutin har makrodefinitionen företräde, eftersom den alltid visas efter funktionsdeklarationen. När du anropar en rutin som implementeras som både en funktion och ett makro kan du tvinga kompilatorn att använda funktionsversionen på två sätt:
Omge rutinnamnet med parenteser.
#include <ctype.h> a = _toupper(a); // Use macro version of toupper. a = (_toupper)(a); // Force compiler to use // function version of toupper.Ta bort makrodefinitionen med
#undef-direktivet:#include <ctype.h> #undef _toupper
Om du behöver välja mellan en funktion och en makroimplementering av en biblioteksrutin bör du överväga följande kompromisser:
Hastighet kontra storlek Den största fördelen med att använda makron är snabbare körningstid. Under förbearbetning expanderas ett makro (ersätts av dess definition) i rad varje gång det används. En funktionsdefinition inträffar bara en gång oavsett hur många gånger den anropas. Makron kan öka kodstorleken men har inte de kostnader som är kopplade till funktionsanrop.
Funktionsutvärdering En funktion utvärderas till en adress. ett makro gör det inte. Därför kan du inte använda ett makronamn i kontexter som kräver en pekare. Du kan till exempel deklarera en pekare till en funktion, men inte en pekare till ett makro.
Typkontroll När du deklarerar en funktion kan kompilatorn kontrollera argumenttyperna. Eftersom du inte kan deklarera ett makro kan kompilatorn inte kontrollera makroargumenttyper. även om det kan kontrollera antalet argument som du skickar till ett makro.