C Preprocesor i makra

W tym samouczku zostaniesz wprowadzony do preprocesorów c i nauczysz się używać #include, #define i kompilacji warunkowej z pomocą przykładów.

Preprocesor C jest preprocesorem makr (umożliwia definiowanie makr), który przekształca program przed jego kompilacją. Te transformacje mogą obejmować dołączenie pliku nagłówkowego, rozszerzenia makr itp.

Wszystkie dyrektywy przetwarzania wstępnego zaczynają się od #symbolu. Na przykład,

 #define PI 3.14

Niektóre z typowych zastosowań preprocesora C to:

W tym pliki nagłówkowe: #include

#includePreprocesora służy do włączenia do programu pliki nagłówkowe C. Na przykład,

 #include 

Tutaj stdio.hjest plik nagłówkowy. #includeDyrektywa preprocesora zastąpi powyższą linię z treścią stdio.hpliku nagłówka.

To jest powód, dla którego musisz użyć, #include zanim będziesz mógł używać funkcji takich jak scanf()i printf().

Możesz także utworzyć własny plik nagłówkowy zawierający deklarację funkcji i dołączyć go do 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 z #define

Makro to fragment kodu, któremu nadano nazwę. Możesz zdefiniować makro w C za pomocą #definedyrektywy preprocesora.

Oto przykład.

 #define c 299792458 // speed of light

Tutaj, gdy używamy c w naszym programie, jest zastępowane przez 299792458.

Przykład 1: #define preprocessor

 #include #define PI 3.1415 int 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; )

Działa jak makra

Możesz także zdefiniować makra, które działają podobnie jak wywołanie funkcji. Nazywa się to makrami podobnymi do funkcji. Na przykład,

 #define circleArea(r) (3.1415*(r)*(r))

Za każdym razem, gdy program się spotyka circleArea(argument), jest zastępowany przez (3.1415*(argument)*(argument)).

Załóżmy, że przekazaliśmy 5 jako argument, a następnie rozwija się jak poniżej:

 circleArea(5) expands to (3.1415*5*5)

Przykład 2: użycie #define preprocesora

 #include #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 preprocesorze.

Kompilacja warunkowa

W programowaniu w C można poinstruować preprocesor, czy ma zawierać blok kodu, czy nie. Aby to zrobić, można użyć dyrektyw warunkowych.

Jest podobne do ifstwierdzenia z jedną zasadniczą różnicą.

ifOświadczenie jest testowany w czasie wykonywania w celu sprawdzenia, czy dany fragment kodu powinny być wykonywane lub nie natomiast, że warunkowe są wykorzystywane w celu włączenia (lub pomiń) blok kodu w programie przed egzekucją.

Zastosowania warunkowe

  • użyj innego kodu w zależności od maszyny, systemu operacyjnego
  • skompilować ten sam plik źródłowy w dwóch różnych programach
  • aby wykluczyć określony kod z programu, ale zachować go jako odniesienie do przyszłych celów

Jak używać warunku?

Aby użyć warunkowe, #ifdef, #if, #defined, #elsei #elseifsą wykorzystywane dyrektyw.

Dyrektywa #ifdef

 #ifdef MACRO // conditional codes #endif 

Tutaj kody warunkowe są zawarte w programie tylko wtedy, gdy zdefiniowano MAKRO.

Dyrektywa #if, #elif i #else

 #if expression // conditional codes #endif 

Tutaj wyrażenie jest wyrażeniem typu całkowitego (mogą to być liczby całkowite, znaki, wyrażenie arytmetyczne, makra itd.).

Kody warunkowe są uwzględniane w programie tylko wtedy, gdy wartość wyrażenia jest różna od zera.

Opcjonalnej #elsedyrektywy można używać z #ifdyrektywą.

 #if expression conditional codes if expression is non-zero #else conditional if expression is 0 #endif 

Możesz również dodać zagnieżdżony warunek do swojego #if… #elseusing#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 służy do sprawdzania, czy określone makro jest zdefiniowane, czy nie. Jest często używany z dyrektywą #if.

 #if defined BUFFER_SIZE && BUFFER_SIZE>= 2048 // codes 

Predefiniowane makra

Oto kilka wstępnie zdefiniowanych makr w programowaniu w C.

Makro Wartość
__DATE__ Ciąg zawierający aktualną datę
__FILE__ Ciąg zawierający nazwę pliku
__LINE__ Liczba całkowita reprezentująca numer bieżącego wiersza
__STDC__ Jeśli jest zgodny ze standardem ANSI C, wartość jest niezerową liczbą całkowitą
__TIME__ Ciąg zawierający aktualną datę.

Przykład 3: pobierz aktualny czas za pomocą __TIME__

Poniższy program wyprowadza bieżący czas za pomocą __TIME__makra.

 #include int main() ( printf("Current time: %s",__TIME__); )

Wynik

 Aktualny czas: 19:54:39

Zalecane lektury

  • Kontrola linii
  • Pragmy
  • Wyjście preprocesora
  • Inne dyrektywy

Interesujące artykuły...