Preprocessador C
El preprocessador C és el preprocessador macro per als llenguatges de programació C, Objective-C i C++. El preprocessador ofereix la possibilitat d'incloure fitxers de capçalera, expansions de macros, compilació condicional i control de línia.
En moltes implementacions de C, és un programa independent invocat pel compilador com a primera part de la traducció.
El llenguatge de les directives del preprocessador només està dèbilment relacionat amb la gramàtica de C i, per tant, de vegades s'utilitza per processar altres tipus de fitxers de text.[1]
El preprocessador es va introduir a C al voltant de 1973 a instàncies d'Alan Snyder i també en reconeixement de la utilitat dels mecanismes d'inclusió de fitxers disponibles a BCPL i PL/I. La seva versió original només oferia la inclusió de fitxers i la substitució simple de cadenes utilitzant #include
i #define
per a macros sense paràmetres, respectivament. Es va ampliar poc després, primer per Mike Lesk i després per John Reiser, per incorporar macros amb arguments i compilació condicional.[2]
El preprocessador C va formar part d'una llarga tradició de macrollenguatge als Laboratoris Bell, que va ser iniciat per Douglas Eastwood i Douglas McIlroy el 1959.[3]
El preprocessament es defineix per les quatre primeres (de vuit) fases de traducció especificades a l'estàndard C.
- Substitució de trígrafs: el preprocessador substitueix les seqüències de trígrafs pels caràcters que representen.
- Empalmament de línies: les línies d'origen físiques que continuen amb seqüències de nova línia escapades s'empalmen per formar línies lògiques.
- Tokenització: el preprocessador divideix el resultat en fitxes de preprocessament i espais en blanc. Substitueix els comentaris per espais en blanc.
- Expansió de macros i maneig de directives: s'executen línies de directives de preprocessament, inclosa la inclusió de fitxers i la compilació condicional. El preprocessador expandeix simultàniament macros i, des de la versió de 1999 de l'estàndard C, gestiona els operadors
_Pragma
.[4]
Fitxers inclosos: Un dels usos més habituals del preprocessador és incloure un altre fitxer:
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
Compilació condicional:
#if VERBOSE >= 2
printf("trace message");
#endif
Definició i expansió de macro:
#define HE HI
#define LLO _THERE
#define HELLO "HI THERE"
#define CAT(a,b) a##b
#define XCAT(a,b) CAT(a,b)
#define CALL(fn) fn(HE,LLO)
CAT(HE, LLO) // "HI THERE", because concatenation occurs before normal expansion
XCAT(HE, LLO) // HI_THERE, because the tokens originating from parameters ("HE" and "LLO") are expanded first
CALL(CAT) // "HI THERE", because parameters are expanded first
Referències
[modifica]- ↑ General-purpose text preprocessing with the C preprocessor. Featuring JavaScript
- ↑ Ritchie (1993)
- ↑ «Bell SAP – SAP with conditional and recursive macros». A: HOPL: Online Historical Encyclopaedia of Programming Languages. Arxivat 2023-10-14 a Wayback Machine.
- ↑ TylerMSFT. «C/C++ preprocessor reference» (en anglès). https://learn.microsoft.com.+[Consulta: 10 maig 2023].
- ↑ «Top (The C Preprocessor)» (en anglès). https://gcc.gnu.org.+[Consulta: 10 maig 2023].