logo

C Preprocesory

Preprocesory jsou programy, které zpracovávají zdrojový kód před kompilací. Mezi napsáním programu a spuštěním programu v C je několik kroků. Podívejme se na tyto kroky, než se skutečně začneme učit o preprocesorech.

preprocesory v c



Mezikroky můžete vidět na výše uvedeném diagramu. Zdrojový kód napsaný programátory se nejprve uloží do souboru, nechť název je program.c . Tento soubor je poté zpracován preprocesory a je vygenerován rozšířený soubor zdrojového kódu s názvem program.i. Tento rozšířený soubor je kompilován kompilátorem a je vygenerován soubor objektového kódu s názvem program.obj. Nakonec linker propojí tento soubor objektového kódu s objektovým kódem funkcí knihovny a vygeneruje spustitelný soubor program.exe.

Směrnice preprocesoru v C

Preprocesorové programy poskytují direktivy preprocesoru, které říkají kompilátoru, aby předzpracoval zdrojový kód před kompilací. Všechny tyto direktivy preprocesoru začínají znakem „#“ (hash). Symbol „#“ označuje, že jakýkoli příkaz začínající znakem „#“ přejde do programu preprocesoru, aby byl proveden. Tyto direktivy preprocesoru můžeme umístit kamkoli v našem programu.

Příklady některých direktiv preprocesoru jsou: #zahrnout , #definovat , #ifndef, atd.



Poznámka Pamatujte, že # symbol poskytuje pouze cestu k preprocesoru a příkaz jako include je zpracován programem preprocesoru. Například #include zahrne kód nebo obsah zadaného souboru ve vašem programu.

Seznam direktiv preprocesoru v C

V následující tabulce jsou uvedeny všechny direktivy preprocesoru v jazyce C:

Předprocesorové směrnice

Popis



#definovat

Používá se k definování makra

#undef

Používá se k zrušení definice makra

#zahrnout

Používá se k zahrnutí souboru do programu se zdrojovým kódem

#ifdef

C
Používá se k zahrnutí části kódu, pokud je určité makro definováno pomocí #define

#ifndef

Používá se k zahrnutí části kódu, pokud určité makro není definováno pomocí #define

#li

Zkontrolujte specifikovaný stav

#jiný

Alternativní kód, který se spustí, když #if selže

#endif

Používá se k označení konce #if, #ifdef a #ifndef

Tyto preprocesory lze klasifikovat podle typu funkce, kterou vykonávají.

Typy C preprocesorů

Existují 4 hlavní typy direktiv preprocesoru:

  1. Makra
  2. Začlenění souboru
  3. Podmíněná kompilace
  4. Další směrnice

Pojďme se nyní podrobně seznámit s každou z těchto směrnic.

1. Makra

V C jsou makra kusy kódu v programu, který má nějaké jméno. Kdykoli kompilátor narazí na tento název, nahradí toto jméno skutečným kusem kódu. The '#definovat' direktiva se používá k definování makra.

Syntaxe definice makra

  #define     token     value>

kde po předběžném zpracování, žeton bude rozšířena na jeho hodnota v programu.

Příklad makra

C




// C Program to illustrate the macro> #include> // macro definition> #define LIMIT 5> int> main()> {> >for> (>int> i = 0; i printf('%d ', i); } return 0; }>

>

>

Výstup

0 1 2 3 4>

Ve výše uvedeném programu, když kompilátor provede slovo LIMIT, nahradí ho 5. Slovo 'OMEZIT' v definici makra se nazývá makro šablona a „5“ je makroexpanze.

Poznámka Na konci definice makra není středník (;). Definice maker nepotřebují k ukončení středník.

Jsou tam i nějaké Předdefinovaná makra v C které jsou užitečné při poskytování různých funkcí našemu programu.

Makra S Argumenty

Argumenty můžeme předávat i makrům. Makra definovaná s argumenty fungují podobně jako funkce.

Příklad

  #define   foo(  a, b  )   a + b  #define func(r) r * r>

Pojďme to pochopit pomocí programu:

C




// C Program to illustrate function like macros> #include> // macro with parameter> #define AREA(l, b) (l * b)> int> main()> {> >int> l1 = 10, l2 = 5, area;> >area = AREA(l1, l2);> >printf>(>'Area of rectangle is: %d'>, area);> >return> 0;> }>

>

>

Výstup

Area of rectangle is: 50>

Z výše uvedeného programu vidíme, že kdykoli překladač najde v programu AREA(l, b), nahradí ji příkazem (l*b). Nejen to, ale hodnoty předané do šablony makra AREA(l, b) budou také nahrazeny v příkazu (l*b). AREA(10, 5) se tedy bude rovnat 10*5.

2. Začlenění souboru

Tento typ direktivy preprocesoru říká kompilátoru, aby zahrnul soubor do programu se zdrojovým kódem. The #include direktiva preprocesoru se používá k zahrnutí hlavičkových souborů do programu C.

Existují dva typy souborů, které může uživatel zahrnout do programu:

Standardní záhlaví souborů

Standardní hlavičkové soubory obsahují definice předdefinovaných funkcí, např printf(), scanf(), atd. Tyto soubory musí být zahrnuty pro práci s těmito funkcemi. Různé funkce jsou deklarovány v různých hlavičkových souborech.
Například standardní I/O funkce jsou v souboru „iostream“, zatímco funkce, které provádějí operace s řetězci, jsou v souboru „řetězec“.

Syntax

  #include   <  file_name>>

kde název souboru je název hlavičkového souboru, který má být zahrnut. The '' závorky řekněte kompilátoru, aby hledal soubor v s standardní adresář.

Uživatelsky definované soubory záhlaví

Když se program stane velmi velkým, je dobré ho rozdělit na menší soubory a zahrnout je, kdykoli je to potřeba. Tyto typy souborů jsou uživatelem definované hlavičkové soubory.

Syntax

  #include   '  filename  '>

The dvojité uvozovky ( ) řekněte kompilátoru, aby hledal soubor záhlaví v adresář zdrojového souboru.

3. Podmíněná kompilace

Podmíněná kompilace ve směrnicích C je typ direktivy, která pomáhá zkompilovat určitou část programu nebo přeskočit kompilaci některé konkrétní části programu na základě určitých podmínek. K vložení podmíněného kódu se používají následující direktivy preprocesoru:

  1. #if Směrnice
  2. #ifdef směrnice
  3. #ifndef směrnice
  4. #else Směrnice
  5. #elif směrnice
  6. #endif směrnice

#endif direktiva se používá k uzavření otevíracích direktiv #if, #ifdef a #ifndef, což znamená, že předzpracování těchto direktiv je dokončeno.

Syntax

  #ifdef     macro_name   // Code to be executed if macro_name is defined #  ifndef     macro_name   // Code to be executed if macro_name is not defined   #if    constant_expr   // Code to be executed if constant_expression is true   #elif     another_constant_expr   // Code to be excuted if another_constant_expression is true   #else   // Code to be excuted if none of the above conditions are true   #endif>

Pokud makro s názvem „ název_makra ‘ je definován, pak se blok příkazů provede normálně, ale pokud není definován, kompilátor tento blok příkazů jednoduše přeskočí.

Příklad

Níže uvedený příklad ukazuje použití direktiv preprocesoru #include #if, #elif, #else a #endif.

C




//program to demonstrates the use of #if, #elif, #else,> // and #endif preprocessor directives.> #include> // defining PI> #define PI 3.14159> int> main()> {> > #ifdef PI> >printf>(>'PI is defined '>);> > #elif defined(SQUARE)> >printf>(>'Square is defined '>);> #else> >#error 'Neither PI nor SQUARE is defined'> #endif> > #ifndef SQUARE> >printf>(>'Square is not defined'>);> #else> >cout <<>'Square is defined'> << endl;> #endif> >return> 0;> }>

>

>

Výstup

PI is defined Square is not defined>

4. Další směrnice

Kromě výše uvedených směrnic existují ještě dvě směrnice, které se běžně nepoužívají. Tyto jsou:

  1. #undef směrnice
  2. Směrnice #pragma

1. Směrnice #undef

Direktiva #undef se používá k zrušení definice existujícího makra. Tato směrnice funguje takto:

#undef LIMIT>

Použití tohoto příkazu zruší definici stávajícího makra LIMIT. Po tomto příkazu bude každý příkaz #ifdef LIMIT vyhodnocen jako nepravdivý.

Příklad

Níže uvedený příklad ukazuje fungování směrnice #undef.

C




#include> // defining MIN_VALUE> #define MIN_VALUE 10> int> main() {> >// Undefining and redefining MIN_VALUE> printf>(>'Min value is: %d '>,MIN_VALUE);> > //undefining max value> #undef MIN_VALUE> > // again redefining MIN_VALUE> #define MIN_VALUE 20> >printf>(>'Min value after undef and again redefining it: %d '>, MIN_VALUE);> >return> 0;> }>

>

>

Výstup

Min value is: 10 Min value after undef and again redefining it: 20>

2. Směrnice #pragma

Tato direktiva je direktiva pro speciální účel a používá se k zapnutí nebo vypnutí některých funkcí. Tyto typy direktiv jsou specifické pro kompilátor, tj. liší se kompilátor od kompilátoru.

Syntax

#pragma   directive>

Některé z direktiv #pragma jsou popsány níže:

  1. #pragma startup: Tyto direktivy nám pomáhají specifikovat funkce, které je potřeba spustit před spuštěním programu (než řízení přejde na main()).
  2. #pragma exit : Tyto direktivy nám pomáhají specifikovat funkce, které je potřeba spustit těsně před ukončením programu (těsně předtím, než se ovládací prvek vrátí z main()).

Níže uvedený program nebude pracovat s kompilátory GCC.

Příklad

Níže uvedený program ilustrují použití #pragma exit a pragma startup

C




// C program to illustrate the #pragma exit and pragma> // startup> #include> void> func1();> void> func2();> // specifying funct1 to execute at start> #pragma startup func1> // specifying funct2 to execute before end> #pragma exit func2> void> func1() {>printf>(>'Inside func1() '>); }> void> func2() {>printf>(>'Inside func2() '>); }> // driver code> int> main()> {> >void> func1();> >void> func2();> >printf>(>'Inside main() '>);> >return> 0;> }>

>

npm cache čistá
>

Očekávaný výstup

Inside func1() Inside main() Inside func2()>

Výše uvedený kód při spuštění na kompilátorech GCC vytvoří výstup, jak je uvedeno níže:

Inside main()c>

K tomu dochází, protože GCC nepodporuje spuštění nebo ukončení #pragma. Můžete však použít níže uvedený kód pro očekávaný výstup na kompilátorech GCC.

C




#include> void> func1();> void> func2();> void> __attribute__((constructor)) func1();> void> __attribute__((destructor)) func2();> void> func1()> {> >printf>(>'Inside func1() '>);> }> void> func2()> {> >printf>(>'Inside func2() '>);> }> int> main()> {> >printf>(>'Inside main() '>);> >return> 0;> }>

>

>

Výstup

Inside func1() Inside main() Inside func2()>

Ve výše uvedeném programu jsme některé použili specifické syntaxe tak, že jedna z funkcí se provede před hlavní funkcí a druhá se provede po hlavní funkci.

#pragma varovat směrnice

Tato direktiva se používá ke skrytí varovné zprávy, která se zobrazuje během kompilace. Varování můžeme skrýt, jak je uvedeno níže:

  • #pragma varovat -rvl : Tato direktiva skryje varování, která jsou vyvolána, když funkce, která má vracet hodnotu, nevrací hodnotu.
  • #pragma varovat -par : Tato direktiva skryje varování, která se objeví, když funkce nepoužívá parametry, které jí byly předány.
  • #pragma varovat -rch : Tato direktiva skryje varování, která se objeví, když je kód nedostupný. Například jakýkoli kód napsaný za vrátit se příkaz ve funkci je nedosažitelný.

Pokud se vám líbí techcodeview.com a chtěli byste přispět, můžete také napsat článek pomocí . Podívejte se, jak se váš článek objeví na hlavní stránce techcodeview.com a pomozte tak dalším geekům. Pokud najdete něco nesprávného nebo pokud chcete sdílet více informací o výše uvedeném tématu, napište prosím komentáře.