*   >> läser Utbildning artiklar >> science >> programming

Introduktion till makron i C

Nästan alla redan definierat en konstant i C med #define KONST 12345 Omdömen men bara en liten grupp verkligen vet vad den linjen gör och hur man utforska dessa funktioner. Varje rad som börjar med en # är inte behandlas av C-kompilator, men C pre-processorn som tolkar dessa linjer och producerar den kod som på ett effektivt sätt kommer att sammanställas. I gcc kan du se resultatet av förbehandlingsstadiet med hjälp av gcc -E src.cWhat definiera Omdömen direktivet gör är att göra preprocessorn ersätta alla förekomster av definitionen av den text som följer det.

Ersättnings är rent text och det finns några knep som är riktigt häftigt. Jag ska tala om två av dem: funktionsliknande makron och multi line macros.Function liknande macrosTo göra en funktion liknande makrot bara sätta den vanliga parentes efter namnet på makro- och följa namnet på sin argumentation. Argumenten kommer att ersättas av den exakta strängen som du skickar till makrot.

Ett snabbt exempel #define print_int (x) printf ("Int% d \\ n", x); När kallas print_int (30), kommer makrot att expandera toprintf ("Int% d \\ n", 30); Multi macrosA multi makro kan byggas sätta ett \\ i slutet av all lina av makrot. Detta tecken anger att makrot fortsätter på nästa rad. #define SWAP (a, b) {\\ a ^ = b; \\ B ^ = a; \\ A ^ = b; \\} Parentesen krävs eftersom detta block måste utvärderas som en enda instruktion. Utan den skulle följande misslyckas:

if (a> b) SWAP (a, b) Makron är dangerousMacros producerar fel som är svåra att felsöka och svårt att patch.

De möjliga fällor är många (fel i företräde aktörer, självrefererande makron, etc). Denna sida har alla av dem verkligen väl dokumenterade. Detta var en liten introduktion till en mer avancerad användning av C-makron. Preprocessorn är en kraftfull funktion och kan användas för att göra massor av bra grejer. Om du vill veta mer om det man kan besöka webbplatsen.

Omdömen

Copyright © 2008 - 2016 läser Utbildning artiklar,https://utbildning.nmjjxx.com All rights reserved.