Latest web development tutorials

C preprocesador

Parte delpreprocesador de C no es el compilador, pero es el proceso de compilación de una etapa separada.En resumen, C preprocesador es sólo una herramienta de sustitución de texto solamente, que le dará instrucciones al compilador para compilar el pretratamiento completo antes de la necesidad real. Vamos a preprocesador de C (C preprocesador) abreviado como CPP.

Todos los pedidos son pre-procesador con una almohadilla (#) al principio. Debe ser el primer carácter no en blanco, con el fin de mejorar la legibilidad, las directivas de preprocesador debe comenzar en la primera columna. A continuación se enumeran todas las instrucciones que se pre-procesador:

指令描述
#define定义宏
#include包含一个源代码文件
#undef取消已定义的宏
#ifdef如果宏已经定义,则返回真
#ifndef如果宏没有定义,则返回真
#if如果给定条件为真,则编译下面代码
#else#if 的替代方案
#elif如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif结束一个 #if……#else 条件编译块
#error当遇到标准错误时,输出错误消息
#pragma使用标准化方法,向编译器发布特殊的命令到编译器中

Ejemplos de pre-procesador

Análisis de entender los ejemplos siguientes instrucciones diferentes.

#define MAX_ARRAY_LENGTH 20

Esta directiva indica CPP para reemplazar toda MAX_ARRAY_LENGTH 20.#defineUtilizar para definir constantes para mejorar la legibilidad.

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

Estas instrucciones le dicen al CPP stdio.h obtener de labiblioteca del sistema, y añadir texto en el archivo fuente de corriente.La siguiente línea dice CPPmyheader.h llegar desde el directorio local y añadir contenido al archivo de fuente de corriente.

#undef  FILE_SIZE
#define FILE_SIZE 42

Esta orden le dice CPP cancelar FILE_SIZE definido, y lo definen como 42.

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

Esta orden le dice CPP sólo cuando MENSAJE indefinido sólo cuando se define MENSAJE.

#ifdef DEBUG
   /* Your debugging statements here */
#endif

Esta orden le dice CPP si se define DEBUG, a continuación, realiza declaración de transformación. En tiempo de compilación, si pasa interruptor-DDEBUGal compilador gcc, este comando es útil. Se define DEBUG, siempre se puede activar o desactivar la depuración durante la compilación.

macros predefinidas

ANSI C define una serie de macros. En la programación, puede utilizar estas macros, pero diferente para modificar directamente estos macros predefinidas.

描述
__DATE__当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。
__TIME__当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。
__FILE__这会包含当前文件名,一个字符串常量。
__LINE__这会包含当前行号,一个十进制常量。
__STDC__当编译器以 ANSI 标准编译时,则定义为 1。

Vamos a tratar los siguientes ejemplos:

#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 de seguridad (en el archivo detest.c) se compila y se ejecuta, produce los siguientes resultados:

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

operador de preprocesador

C preprocesador proporciona los siguientes operadores para ayudarle a crear una macro:

La continuación del operador de macro (\)

Una macro se suele escribir en una sola línea. Sin embargo, si la macro es demasiado largo para caber en una sola línea, utilice la continuación del operador de macro (\). Por ejemplo:

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

operador de cadenas literales de cuantificación (#)

En las definiciones de macros, cuando se necesita para poner un argumento de macro en una constante de cadena, la cadena operador de cuantización constante (#). Macro utilizando el operador dispone de una lista de parámetros o parámetro específico. 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 se compila y ejecuta, produce los siguientes resultados:

Carole and Debra: We love you!
pegar operador de emergencia (##)

pegar operador de emergencia (##) dentro de la definición de la macro se fusionará los dos parámetros. Permite dos etiquetas de definición de macro independientes se combinan en una etiqueta. Por ejemplo:

#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 se compila y ejecuta, produce los siguientes resultados:

token34 = 40

Esto es lo que pasó, porque este ejemplo producirá la siguiente salida real del compilador:

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

Este ejemplo demuestra el token ## n se conecta a token34 aquí, hemos utilizado eloperador de cadena constante de cuantificación (#), y el operador pegar token (##).

definido) operador (

operador preprocesadordefinido se utiliza en una expresión constante utilizado para determinar si un identificador se ha definido mediante el #define.Si el identificador especificado ya está definido, el valor es verdadero (distinto de cero). Si no se define el identificador especifica, el valor es falso (cero). El siguiente ejemplo ilustra el uso definido por el operador ():

#include <stdio.h>

#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif

int main(void)
{
   printf("Here is the message: %s\n", MESSAGE);  
   return 0;
}

Cuando el código se compila y ejecuta, produce los siguientes resultados:

Here is the message: You wish!

macro con parámetros

CPP es una característica de gran alcance puede ser utilizado para simular la función macro con parámetros. Por ejemplo, el código siguiente es calcular el cuadrado de un número:

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

Podemos utilizar una macro para volver a escribir el código anterior, de la siguiente manera:

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

Antes de utilizar macros con parámetros, debe utilizaruna directiva #define.Lista de parámetros se encierra entre paréntesis, y debe ser inmediatamente detrás del nombre de la macro. No se permite un espacio entre el nombre de la macro y el paréntesis izquierdo. Por ejemplo:

#include <stdio.h>

#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main(void)
{
   printf("Max between 20 and 10 is %d\n", MAX(10, 20));  
   return 0;
}

Cuando el código se compila y ejecuta, produce los siguientes resultados:

Max between 20 and 10 is 20