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 fr. 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