Latest web development tutorials

pré-processador C ++

Algumas directivas de pré-processador, dirige o pré-processador para o compilador antes da compilação real que você precisa para ser concluído.

Todas as directivas de pré-processador são (#) começando com o sinal de libra, a apenas um caractere de espaço pode aparecer antes das diretivas de pré-processamento. C ++ pré-processador diretiva não é uma declaração, para que eles não são um ponto e vírgula; no final ().

Vimos todas as instâncias anteriores têm diretiva#include.Esta macro é arquivo de cabeçalho utilizado ser incluídos no arquivo de origem.

C ++ também suporta uma série de directivas de pré-processamento, tais como # incluem, # define, # se, # else, # line, etc., vamos olhar para estas instruções importantes.

pré-processamento #define

pré-processador diretiva #define usado para criar uma constantes simbólicas. A constante simbólica é geralmente chamado demacro, a forma do comando geral é:

#define macro-name replacement-text 

Quando esta linha de código aparecem em um arquivo, o arquivo aparece na subsequente Todas as macros serão substituídos com a substituição de texto antes de o programa é compilado. Por exemplo:

#include <iostream>
using namespace std;

#define PI 3.14159

int main ()
{
 
    cout << "Value of PI :" << PI << endl; 

    return 0;
}

Agora, vamos testar esse código, dê uma olhada nos resultados de pré-tratamento. Suponha que o arquivo de origem já existe, então use a opção -E para compilar e para redirecionar os resultados para test.p. Agora, se você olhar test.p arquivo, você vai ver que ele já contém uma grande quantidade de informações, eo valor foi alterado no final do arquivo da seguinte forma:

$gcc -E test.cpp > test.p

...
int main ()
{
 
    cout << "Value of PI :" << 3.14159 << endl; 

    return 0;
}

funções de macro

Você pode usar # define para definir a macro da seguinte forma com um parâmetro:

#include <iostream>
using namespace std;

#define MIN(a,b) (((a)<(b)) ? a : b)

int main ()
{
   int i, j;
   i = 100;
   j = 30;
   cout <<"The minimum is " << MIN(i, j) << endl;

    return 0;
}

Quando o código acima é compilado e executado, ele produz os seguintes resultados:

The minimum is 30

compilação condicional

Existem vários comandos que podem ser utilizados selectivamente sobre a parte do código fonte do programa é compilado. Este processo é conhecido como compilação condicional.

Estruturar e escolher se as condições estruturais muito parecido com o pré-processador. Considere o seguinte código de passagem pré-processador:

#ifndef NULL
   #define NULL 0
#endif

Você pode fazer apenas quando compilado com a depuração, a depuração pode ser realizado utilizando uma macro, como segue:

#ifdef DEBUG
   cerr <<"Variable x = " << x << endl;
#endif

Se antes a instrução DEBUG #ifdef foi definido DEBUG constante simbólica, será sobre as demonstrações programacerr compilados.Você pode usar #if 0 comentário fora a parte declaração do programa, conforme segue:

#if 0
   不进行编译的代码
#endif

Vamos tentar os seguintes exemplos:

#include <iostream>
using namespace std;
#define DEBUG

#define MIN(a,b) (((a)<(b)) ? a : b)

int main ()
{
   int i, j;
   i = 100;
   j = 30;
#ifdef DEBUG
   cerr <<"Trace: Inside main function" << endl;
#endif

#if 0
   /* 这是注释部分 */
   cout << MKSTR(HELLO C++) << endl;
#endif

   cout <<"The minimum is " << MIN(i, j) << endl;

#ifdef DEBUG
   cerr <<"Trace: Coming out of main function" << endl;
#endif
    return 0;
}

Quando o código acima é compilado e executado, ele produz os seguintes resultados:

Trace: Inside main function
The minimum is 30
Trace: Coming out of main function

# e ## operadores

# ## E operador de pré-processamento em C ++ e ANSI / ISO C, em que está disponível. # Operador de substituição de texto token será convertida para uma string entre aspas.

Considere a seguinte definição de macro:

#include <iostream>
using namespace std;

#define MKSTR( x ) #x

int main ()
{
    cout << MKSTR(HELLO C++) << endl;

    return 0;
}

Quando o código acima é compilado e executado, ele produz os seguintes resultados:

HELLO C++

Vamos ver como ele funciona. Compreensivelmente, C ++ pré-processador a seguinte linha:

cout << MKSTR(HELLO C++) << endl;

Convertido em:

cout << "HELLO C++" << endl;

## Os operadores são usados ​​para conectar dois tokens. Aqui está um exemplo:

#define CONCAT( x, y )  x ## y

Quando CONCAT aparece no programa, os seus parâmetros vai ser ligado, e utilizado para substituir a macro. Por exemplo, o programa CONCAT (OlÁ, C ++) é substituído por "OlÁ C ++", como mostrado nos exemplos seguintes.

#include <iostream>
using namespace std;

#define concat(a, b) a ## b
int main()
{
   int xy = 100;
   
   cout << concat(x, y);
   return 0;
}

Quando o código acima é compilado e executado, ele produz os seguintes resultados:

100

Vamos ver como ele funciona. Compreensivelmente, C ++ pré-processador a seguinte linha:

cout << concat(x, y);

Convertido em:

cout << xy;

macros predefinidas C ++

C ++ é fornecida na tabela abaixo alguns macros predefinidas:

描述
__LINE__ 这会在程序编译时包含当前行号。
__FILE__ 这会在程序编译时包含当前文件名。
__DATE__ 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。
__TIME__ 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。

Vejamos esses exemplos macros:

#include <iostream>
using namespace std;

int main ()
{
    cout << "Value of __LINE__ : " << __LINE__ << endl;
    cout << "Value of __FILE__ : " << __FILE__ << endl;
    cout << "Value of __DATE__ : " << __DATE__ << endl;
    cout << "Value of __TIME__ : " << __TIME__ << endl;

    return 0;
}

Quando o código acima é compilado e executado, ele produz os seguintes resultados:

Value of __LINE__ : 6
Value of __FILE__ : test.cpp
Value of __DATE__ : Feb 28 2011
Value of __TIME__ : 18:52:48