Preprocessor, const, static, and enum · Preprocesador, const, static y enum
Lo que ocurre antes del compilador
- Antes de que el compilador vea tu código, el preprocesador maneja cada línea que comienza con
#. - Inserta encabezados, reemplaza macros y elimina comentarios: es un paso simple de texto.
- Ya lo has utilizado:
#include <stdio.h>es una directiva del preprocesador.
#include y #define
#include <stdio.h>pega el contenido de un encabezado para que puedas usar sus funciones.#define PI 3.14159conviertePIen una macro: el preprocesador reemplaza cadaPIpor ese texto.- Las macros no tienen tipo ni punto y coma; son un reemplazo de texto puro.
const vs #define
const double pi = 3.14159;es una variable real que no puede ser modificada. Tiene un tipo, por lo que el compilador lo verifica.#define PI 3.14159es simplemente un reemplazo de texto, realizado antes de compilar.- En el C moderno generalmente se prefiere
constpara valores, pero#definesigue siendo común para constantes y banderas.
static y enum
- Una variable
staticdentro de una función mantiene su valor entre llamadas; se inicializa una sola vez, no se reinicia cada vez que la función se ejecuta. - Un
enumda nombres a un conjunto de valoresintrelacionados:enum Suit { HEARTS, DIAMONDS, CLUBS, SPADES };(aquíHEARTSvale0). - Ambos mejoran la claridad del código:
staticpara memoria persistente,enumpara opciones nombradas.
#include <stdio.h>
#define GREETING "Hello"
enum Color { RED, GREEN, BLUE };
int main(void) {
printf("%s\n", GREETING); // Hello
enum Color c = GREEN;
printf("%d\n", c); // 1
return 0;
}
Errores comunes
#definerealiza un reemplazo de texto simple: envuelve los cuerpos de las macros entre paréntesis.constno puede cambiarse; una variable localstaticconserva su valor entre llamadas.
Ahora tú prueba
- Usa los
#defineyenumproporcionados en los archivos de inicio. - Una variable local
staticrecuerda su valor entre llamadas. No escribas unmain— el verificador proveerá uno.
The · El enum Suit { HEARTS, DIAMONDS, CLUBS, SPADES } is given. Complete const char *suit_name(enum Suit s) so it returns the name ("Hearts", "Diamonds", "Clubs", "Spades") using a switch. Do not · no write a main. · Se da enum Suit { HEARTS, DIAMONDS, CLUBS, SPADES }. Completa const char *suit_name(enum Suit s) para que devuelva el nombre ("Hearts", "Diamonds", "Clubs", "Spades") usando un switch. No escribas una función main.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.
A macro #define PI 3.14159265358979 is given. Complete double circle_area(double r) so it returns the area of a circle, PI * r * r, using the macro. Do not · no write a main. · Se da una macro #define PI 3.14159265358979. Completa double circle_area(double r) para que devuelva el área de un círculo, PI * r * r, usando la macro. No escribas una función main.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.
Complete int next_id(void) using a static local counter, so the first call returns 1, the next 2, then 3, and so on. Do not · no write a main. · Completa int next_id(void) usando un contador local static, de modo que la primera llamada devuelva 1, la siguiente 2, luego 3, y así sucesivamente. No escribas una función main.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.