English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial básico de lenguaje C

Control de flujo de lenguaje C

Funciones en C

Arreglos en C

Punteros en C

Cadenas en C

Estructura de lenguaje C

Archivo de lenguaje C

Otro C

Manual de referencia del lenguaje C

Preprocesador en C

En este tutorial, le presentaremos el preprocesador de C y aprenderemos a usar #include, #define y compilación condicional con la ayuda de ejemplos. El preprocesador de C es un preprocesador de macros (que le permite definir macros) que se puede transformar antes de la compilación del programa. Estas transformaciones pueden incluir archivos de cabecera, expansión de macros, etc. Todas las instrucciones de preprocesamiento comienzan con el símbolo #.

Preprocesador de CNo es parte del compilador, pero es un paso separado en el proceso de compilación. En resumen, el preprocesador de C no es más que una herramienta de sustitución de texto, que indica al compilador que realice las transformaciones necesarias antes de la compilación real. Vamos a abreviar el preprocesador de C (C Preprocessor) como CPP.

Todas las instrucciones del preprocesador comienzan con el símbolo de número (#). Debe ser el primer carácter no vacío, y para mejorar la legibilidad, las instrucciones del preprocesador deben comenzar desde la primera columna. A continuación se muestra una lista de todas las instrucciones preprocesador importantes:

InstrucciónDescripción
#defineDefinir macros
#includeIncluir un archivo de código fuente
#undefDeshacer la definición de macros
#ifdefRetornar verdadero si el macro ya está definido
#ifndefRetornar verdadero si el macro no está definido
#ifSi la condición dada es verdadera, entonces compilar el siguiente código
#elseSustituto de #if
#elifSi la condición anterior #if no es verdadera, y la condición actual es verdadera, entonces compilar el siguiente código
#endifFinalizar un bloque de compilación condicional #if……#else
#errorAl encontrar errores de estándar, mostrar mensajes de error
#pragmaUsar métodos estándar para publicar comandos especiales al compilador

Ejemplo de preprocesador

Analice el siguiente ejemplo para entender diferentes instrucciones.

#define MAX_ARRAY_LENGTH 20

Esta instrucción le indica a CPP que reemplace todos los MAX_ARRAY_LENGTH con 20. Usar #define Definir constantes para mejorar la legibilidad.

#include <stdio.h>
#include "myheader.h"

Estas instrucciones le indican a CPP que obtenga desdeBiblioteca del sistemaObtener stdio.h y agregar texto al archivo fuente actual. La siguiente línea le indica a CPP que obtenga desde el directorio local. myheader.hy agregue contenido al archivo de origen actual.

#undef FILE_SIZE
#define FILE_SIZE 42

Esta instrucción le dice a CPP que desdefina FILE_SIZE y defínalo como 42。

#ifndef MESSAGE
   #define MESSAGE "You wish!"
#endif

Esta instrucción le dice a CPP que defina MESSAGE solo si MESSAGE no está definido.

#ifdef DEBUG
   /* Sus instrucciones de depuración aquí */
#endif

Esta instrucción le dice a CPP que ejecute la instrucción de procesamiento si se definió DEBUG. Al compilar, si le pasa -DDEBUG Switches, esta instrucción es muy útil. Define DEBUG, que puede activar o desactivar la depuración en cualquier momento durante la compilación.

Macros predefinidas

ANSI C define muchas macros. Puede usar estas macros en la programación, pero no puede modificar directamente estas macros predefinidas.

MacrosDescripción
__DATE__La fecha actual, una constante de carácter representada en el formato "MMM DD YYYY".
__TIME__La hora actual, una constante de carácter representada en el formato "HH:MM:SS".
__FILE__Esto incluirá el nombre del archivo actual, una constante de cadena.
__LINE__Esto incluirá el número de línea actual, una constante decimal.
__STDC__Cuando el compilador compila con el estándar ANSI, se define 1。

Vamos a intentar el siguiente ejemplo:

#include <stdio.h>
main()
{
   printf("File :%s\n", __FILE__);
   printf("Date :%s\n", __DATE__);
   printf("Time :%s\n", __TIME__);
   printf("Line :%d\n", __LINE__);
   printf("ANSI :%d\n", __STDC__);
}

Cuando el código anterior (en el archivo test.c Al ser compilado y ejecutado, produce los siguientes resultados:

File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1

Operadores de preprocesador

El preprocesador C proporciona los siguientes operadores para ayudarle a crear macros:

El operador de extensión de macro (\)

Una macro generalmente se escribe en una línea. Pero si la macro es demasiado larga y no cabe en una línea, se utiliza el operador de extensión de macro (\). Por ejemplo:

#define message_for(a, b) \"}}
    printf(#a " and " #b ": We love you!\n")

字符串常量化运算符(#)

En las definiciones de macros, cuando se necesita convertir un parámetro de macro a una constante de cadena, se utiliza el operador de cuantificación de cadena (#). En macros, este operador tiene un parámetro específico o lista de parámetros. Por ejemplo:

#include <stdio.h>
#define message_for(a, b) \"}}
    printf(#a " and " #b ": We love you!\n")
int main(void)
{
   message_for(Carole, Debra);
   return 0;
}

Cuando el código anterior se compila y ejecuta, producirá los siguientes resultados:

Carole and Debra: We love you!

标记粘贴运算符(##)

宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个标记。例如:

#include <stdio.h>
#define tokenpaster(n) printf ("token" #n " = %d", token##n)
int main(void)
{
   int token34 = 40;
   
   tokenpaster(34);
   return 0;
}

Cuando el código anterior se compila y ejecuta, producirá los siguientes resultados:

token34 = 40

这是怎么发生的,因为这个示例会从编译器产生下列的实际输出:

printf ("token34 = %d", token34);

这个示例演示了 token##n 会连接到 token34 中,在这里,我们使用了字符串常量化运算符(#)标记粘贴运算符(##)

defined() 运算符

预处理器 defined 运算符是用在常量表达式中的,用来确定一个标识符是否已经使用 #define 定义过。如果指定的标识符已定义,则值为真(非零)。如果指定的标识符未定义,则值为假(零)。下面的示例演示了 defined() 运算符的用法:

#include <stdio.h>
#if !defined(MESSAGE)
   #define MESSAGE "You wish!"
#endif
int main(void)
{
   printf("这是消息: %s\n", MESSAGE);  
   return 0;
}

Cuando el código anterior se compila y ejecuta, producirá los siguientes resultados:

这是消息: You wish!

参数化的宏

CPP 一个强大的功能是可以使用参数化的宏来模拟函数。例如,下面的代码是计算一个数的平方:

int square(int x) {
   return x * x;
}

我们可以使用宏重写上面的代码,如下:

#define square(x) ((x) * (x))

在使用带有参数的宏之前,必须使用 #define 指令定义。参数列表是括在圆括号内,且必须紧跟在宏名称的后边。宏名称和左圆括号之间不允许有空格。例如:

#include <stdio.h>
#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main(void)
{
   printf("10hasta2El valor máximo entre 0 es %d\n", MAX(10, 20));  
   return 0;
}

Cuando el código anterior se compila y ejecuta, producirá los siguientes resultados:

10hasta2El valor máximo entre 0 20