Preprocesor C jest preprocesorem makr (pozwala definiować makra), który przekształca program przed jego kompilacją. Przekształcenia te mogą polegać na dołączeniu pliku nagłówkowego, rozszerzeniu makr itp.
Wszystkie dyrektywy preprocesora zaczynają się od symbolu #
. Na przykład,
#define PI 3.14
Niektóre z powszechnych zastosowań preprocesora C to:
- Włączanie plików nagłówkowych: #include
- Makra używające #define
- Przykład 1: #define preprocessor
- Makra funkcyjne
- Przykład 2: Użycie #define preprocesora
- Kompilacja warunkowa
- Usługi warunkowe
- Jak używać warunkowych?
- #ifdef Dyrektywa
- #if, #elif i #else Dyrektywa
- #defined
- Makra predefiniowane
- Przykład 3: Uzyskaj bieżący czas używając __TIME__
- Zalecane lektury
Włączanie plików nagłówkowych: #include
Preprocesor #include
jest używany do dołączania plików nagłówkowych do programów C. Na przykład,
#include <stdio.h>
Tutaj, stdio.h
jest plikiem nagłówkowym. Dyrektywa preprocesora #include
zastępuje powyższy wiersz zawartością pliku nagłówkowego stdio.h
.
To jest powód, dla którego musisz użyć #include <stdio.h>
, zanim będziesz mógł użyć funkcji takich jak scanf()
i printf()
.
Możesz również utworzyć własny plik nagłówkowy zawierający deklarację funkcji i dołączyć go do swojego programu za pomocą tej dyrektywy preprocesora.
#include "my_header.h"
Odwiedź tę stronę, aby dowiedzieć się więcej o używaniu plików nagłówkowych.
Makra używające #define
Makro jest fragmentem kodu, któremu nadano nazwę. Makro można zdefiniować w języku C za pomocą dyrektywy #define
preprocesora.
Oto przykład.
#define c 299792458 // speed of light
Gdy w naszym programie używamy c, jest ono zastępowane przez 299792458
.
Przykład 1: #define preprocessor
#include <stdio.h>#define PI 3.1415int main(){ float radius, area; printf("Enter the radius: "); scanf("%f", &radius); // Notice, the use of PI area = PI*radius*radius; printf("Area=%.2f",area); return 0;}
Makra funkcyjne
Można również zdefiniować makra, które działają w podobny sposób jak wywołanie funkcji. Jest to znane jako makra podobne do funkcji. Na przykład,
#define circleArea(r) (3.1415*(r)*(r))
Za każdym razem, gdy program napotyka circleArea(argument)
, jest on zastępowany przez (3.1415*(argument)*(argument))
.
Przypuśćmy, że przekazaliśmy 5 jako argument, wtedy, interpretuje to jak poniżej:
circleArea(5) expands to (3.1415*5*5)
Przykład 2: Użycie #define preprocesora
#include <stdio.h>#define PI 3.1415#define circleArea(r) (PI*r*r)int main() { float radius, area; printf("Enter the radius: "); scanf("%f", &radius); area = circleArea(radius); printf("Area = %.2f", area); return 0;}
Odwiedź tę stronę, aby dowiedzieć się więcej o makrach i #define preprocesora.
Kompilacja warunkowa
W programowaniu C, możesz poinstruować preprocesor, czy dołączyć blok kodu, czy nie. Aby to zrobić, można użyć dyrektyw warunkowych.
Jest to podobne do instrukcji if
z jedną zasadniczą różnicą.
Konstrukcja if
jest testowana w czasie wykonywania, aby sprawdzić, czy blok kodu powinien być wykonany, czy nie, podczas gdy dyrektywy warunkowe są używane do włączenia (lub pominięcia) bloku kodu w programie przed wykonaniem.
Usługi warunkowe
- używaj różnego kodu w zależności od maszyny, systemu operacyjnego
- kompiluj ten sam plik źródłowy w dwóch różnych programach
- wyłącz pewien kod z programu, ale zachowaj go jako odniesienie dla przyszłych celów
Jak używać warunkowych?
Aby użyć warunkowego, używane są dyrektywy #ifdef
, #if
, #defined
, #else
i #elseif
.
#ifdef Dyrektywa
#ifdef MACRO // conditional codes#endif
Tutaj, kody warunkowe są włączane do programu tylko wtedy, gdy zdefiniowane jest MACRO.
#if, #elif i #else Dyrektywa
#if expression // conditional codes#endif
Tutaj, wyrażenie jest wyrażeniem typu całkowitego (mogą to być liczby całkowite, znaki, wyrażenia arytmetyczne, makra i tak dalej).
Kody warunkowe są włączane do programu tylko wtedy, gdy wyrażenie jest obliczane na wartość niezerową.
Opcjonalna dyrektywa #else
może być używana z dyrektywą #if
.
#if expression conditional codes if expression is non-zero#else conditional if expression is 0#endif
Możesz również dodać zagnieżdżone warunkowe do swoich #if...#else
używając #elif
#if expression // conditional codes if expression is non-zero#elif expression1 // conditional codes if expression is non-zero#elif expression2 // conditional codes if expression is non-zero#else // conditional if all expressions are 0#endif
#defined
Specjalny operator #defined jest używany do testowania czy pewne makro jest zdefiniowane czy nie. Jest on często używany z dyrektywą #if.
#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048 // codes
Makra predefiniowane
Oto niektóre makra predefiniowane w programowaniu w języku C.
Makro | Wartość |
---|---|
__DATE__ |
Łańcuch zawierający bieżącą datę |
__FILE__ |
A. łańcuch zawierający nazwę pliku |
__LINE__ |
Liczba całkowita reprezentująca bieżący numer wiersza |
__STDC__ |
Jeśli jest zgodny ze standardem ANSI C, to wartością jest niezerowa liczba całkowita |
__TIME__ |
łańcuch zawierający bieżącą datę. |
Przykład 3: Uzyskaj bieżący czas używając __TIME__
Poniższy program wyprowadza bieżący czas używając makra __TIME__
.
#include <stdio.h>int main(){ printf("Current time: %s",__TIME__); }
Output
Current time: 19:54:39
Zalecane lektury
- Kontrola linii
- Pragmaty
- Wyjście preprocesora
- Inne dyrektywy
.