English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, será apresentado o pré-processador C e, com a ajuda de exemplos, aprenderemos a usar #include, #define e compilação condicional. O programa de pré-processamento C é um pré-processamento de macro (que permite definir macros), que pode ser transformado antes da compilação do programa. Essas transformações podem incluir arquivos de cabeçalho, expansão de macros, etc. Todos os comandos de pré-processamento começam com o símbolo #.
Pré-processador Cnão faz parte do compilador, mas é uma etapa separada no processo de compilação. Em resumo, o pré-processador C não é mais do que uma ferramenta de substituição de texto, que indica ao compilador para completar a pré-processamento necessária antes da compilação real. Vamos abreviar o pré-processador C (C Preprocessor) como CPP.
todos os comandos de pré-processador começam com o caractere de número (#). Ele deve ser o primeiro caractere não vazio, para melhorar a legibilidade, as instruções do pré-processador devem começar da primeira coluna. A seguir está listado todos os comandos importantes do pré-processador:
instrução | Description |
---|---|
#define | definir macro |
#include | incluir um arquivo de código-fonte |
#undef | cancelar o macro definido |
#ifdef | se o macro já estiver definido, retorna verdadeiro |
#ifndef | se o macro não estiver definido, retorna verdadeiro |
#if | se a condição fornecida for verdadeira, então compile o código a seguir |
#else | alternativa para #if |
#elif | se a condição fornecida anteriormente não for verdadeira, a condição atual é verdadeira, então compile o código a seguir |
#endif | finalizar um bloco de compilação condicional #if...#else |
#error | ao encontrar erro padrão, exibir mensagem de erro |
#pragma | usar métodos padronizados, publicar comandos especiais para o compilador |
analisar o exemplo a seguir para entender diferentes comandos.
#define MAX_ARRAY_LENGTH 20
esse comando informa ao CPP para substituir todos os MAX_ARRAY_LENGTH por 20. Use #define definir constantes para melhorar a legibilidade.
#include <stdio.h> #include "myheader.h"
esses comandos informam ao CPP parabiblioteca do sistemaObtém stdio.h e adiciona o texto ao arquivo fonte atual. A próxima linha informa ao CPP para obter myheader.hand add content to the current source file.
#undef FILE_SIZE #define FILE_SIZE 42
This instruction tells CPP to cancel the already defined FILE_SIZE and define it as 42。
#ifndef MESSAGE #define MESSAGE "You wish!" #endif
This instruction tells CPP to define MESSAGE only when MESSAGE is not defined.
#ifdef DEBUG /* Your debugging statements here */ #endif
This instruction tells CPP to execute the processing statement if DEBUG is defined. When compiling, if you pass -DDEBUG Switch, this instruction is very useful. It defines DEBUG, you can turn on or off debugging at any time during compilation.
ANSI C defines many macros. You can use these macros in programming, but you cannot directly modify these predefined macros.
Macro | Description |
---|---|
__DATE__ | Current date, a character constant represented in the format "MMM DD YYYY". |
__TIME__ | Current time, a character constant represented in the format "HH:MM:SS". |
__FILE__ | This will include the current filename, a string constant. |
__LINE__ | This will include the current line number, a decimal constant. |
__STDC__ | When the compiler compiles with ANSI standard, it is defined as 1。 |
Let's try the following example:
#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__); }
When the above code (in the file test.c When it is compiled and executed, it will produce the following results:
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
The C preprocessor provides the following operators to help you create macros:
Macro continuation operator (\)
A macro is usually written on a single line. However, if the macro is too long and cannot fit on a single line, the macro continuation operator (\) is used. For example:
#define message_for(a, b) \ printf(#a " and " #b ": We love you!\n")
字符串常量化运算符(#)
No macro definition, when it is necessary to convert a macro parameter to a string constant, the string constant operator (#) is used. The operator used in the macro has a specific parameter or parameter list. For example:
#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; }
Quando o código acima for compilado e executado, ele produzirá o seguinte resultado:
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; }
Quando o código acima for compilado e executado, ele produzirá o seguinte resultado:
token34 = 40
这是怎么发生的,因为这个示例会从编译器产生下列的实际输出:
printf("token"34 =%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; }
Quando o código acima for compilado e executado, ele produzirá o seguinte resultado:
这是消息: 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("10e2O maior valor entre 0 %d\n", MAX(10, 20)); return 0; }
Quando o código acima for compilado e executado, ele produzirá o seguinte resultado:
10e2O maior valor entre 0 20