Preprocessador C

De la Viquipèdia, l'enciclopèdia lliure

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.

  1. Substitució de trígrafs: el preprocessador substitueix les seqüències de trígrafs pels caràcters que representen.
  2. 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.
  3. Tokenització: el preprocessador divideix el resultat en fitxes de preprocessament i espais en blanc. Substitueix els comentaris per espais en blanc.
  4. 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]

Exemples [5][modifica]

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]