Latest web development tutorials

C de la préprocesseur

Certaines directives de préprocesseur, dirige le préprocesseur du compilateur avant la compilation réelle que vous devez remplir.

Toutes les directives de préprocesseur sont (#) en commençant par le signe dièse, seul un caractère d'espace peut apparaître avant que les directives de préprocesseur. La directive de préprocesseur de C est pas une déclaration, de sorte qu'ils ne sont pas un point-virgule; à la fin ().

Nous avons vu toutes les instances précédentes ont directive#include.Cette macro est le fichier d'en-tête utilisé être inclus dans le fichier source.

C ++ prend également en charge un certain nombre de directives de prétraitement, tels que # comprennent, # définir, # si, # else, # ligne, etc., penchons-nous sur ces instructions importantes.

#define prétraitement

directive préprocesseur #define utilisé pour créer une des constantes symboliques. La constante symbolique est généralement appelé unemacro, la forme de la commande générale est:

#define macro-name replacement-text 

Lorsque cette ligne de code apparaît dans un fichier, le fichier apparaît dans la suite Toutes les macros seront remplacées par le remplacement de texte avant que le programme est compilé. Par exemple:

#include <iostream>
using namespace std;

#define PI 3.14159

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

    return 0;
}

Maintenant, nous allons tester ce code, un coup d'oeil sur les résultats de prétraitement. Supposons que le fichier source existe déjà, puis utilisez l'option -E pour compiler et de rediriger les résultats à test.p. Maintenant, si vous regardez test.p fichier, vous verrez qu'il contient déjà beaucoup d'informations, et la valeur a été modifiée dans le bas du fichier comme suit:

$gcc -E test.cpp > test.p

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

    return 0;
}

Fonctions Macro

Vous pouvez utiliser #define pour définir la macro comme suit avec un paramètre:

#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;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants:

The minimum is 30

compilation conditionnelle

Il existe plusieurs commandes qui peuvent être utilisées sélectivement sur la partie du code source du programme est compilé. Ce processus est connu comme la compilation conditionnelle.

Structure et choisissez si les conditions structurelles peu comme le préprocesseur. Considérons le code passage préprocesseur suivant:

#ifndef NULL
   #define NULL 0
#endif

Vous pouvez faire uniquement si compilé avec le débogage, le débogage peut être réalisé en utilisant une macro, comme suit:

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

Si , avant le DEBUG de l'instruction a été définie DEBUG constante symbolique, il sera sur les étatsde programme cerrcompilés. Vous pouvez utiliser #if 0 commentaire sur la partie de la déclaration du programme, comme suit:

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

Essayons les exemples suivants:

#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;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants:

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

# et ## opérateurs

# ## Et l'opérateur de pré-traitement en C ++ et C ANSI / ISO en elle est disponible. # Opérateur jeton de remplacement texte sera converti en une chaîne entre guillemets.

Considérez la macro définition suivante:

#include <iostream>
using namespace std;

#define MKSTR( x ) #x

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

    return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants:

HELLO C++

Voyons comment cela fonctionne. Naturellement, C ++ préprocesseur la ligne suivante:

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

Converti en:

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

## Les opérateurs sont utilisés pour connecter deux jetons. Voici un exemple:

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

Lorsque CONCAT apparaît dans le programme, ses paramètres seront liés, et utilisées pour remplacer la macro. Par exemple, le programme CONCAT (BONJOUR, C ++) est remplacé par «BONJOUR C ++", comme illustré dans les exemples suivants.

#include <iostream>
using namespace std;

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

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants:

100

Voyons comment cela fonctionne. Naturellement, C ++ préprocesseur la ligne suivante:

cout << concat(x, y);

Converti en:

cout << xy;

macros prédéfinies de C

C ++ est fourni dans le tableau ci-dessous quelques macros prédéfinies:

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

Penchons-nous sur ces macros exemples:

#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;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants:

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