Latest web development tutorials

C ++ препроцессор

Некоторые директивы препроцессора, направляет препроцессор компилятора до фактической компиляции, которые необходимо выполнить.

Все директивы препроцессора (#), начиная со знака фунта, только символ пробела может появиться перед директивами препроцессора. Директива препроцессора C ++ не является утверждением, так что они не являются точкой с запятой, а в конце ().

Мы видели все предыдущие экземпляры имеют#include директивы.Этот макрос используется файл заголовка будет включен в исходный файл.

C ++ также поддерживает ряд директив предварительной обработки, таких как # включают, # определить, # если, # # еще, линии и т.д., давайте посмотрим на эти важные инструкции.

#define предварительная обработка

#define препроцессорная используется для создания символических констант. Символьная константа обычно называетсямакро, форма общей команды:

#define macro-name replacement-text 

Когда эта строка кода появляется в файле, файл появится в последующем все макросы будут заменены замены текстом до компиляции программы. Например:

#include <iostream>
using namespace std;

#define PI 3.14159

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

    return 0;
}

Теперь, давайте проверим этот код, взгляните на результаты предварительной обработки. Предположим, что исходный файл уже существует, то используйте опцию -E для компиляции и перенаправить результаты в test.p. Теперь, если вы посмотрите test.p файл, вы увидите, что она уже содержит много информации, а значение было изменено в нижней части файла следующим образом:

$gcc -E test.cpp > test.p

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

    return 0;
}

Макро Функции

Вы можете использовать #define для определения макросов следующим образом с параметром:

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

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

The minimum is 30

Условная компиляция

Есть несколько команд, которые могут быть использованы выборочно на части исходного кода программы компиляции. Этот процесс известен как условной компиляции.

Структура и выбрать, если структурные условия так же, как препроцессора. Рассмотрим следующий фрагмент кода препроцессора:

#ifndef NULL
   #define NULL 0
#endif

Вы можете сделать только при компиляции с возможностью отладки, отладки может быть реализована с помощью макроса, следующим образом:

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

Если перед командой #ifdef DEBUG была определена символическая константа DEBUG, это будет на заявлениях программысегг , собранным.Вы можете использовать #if 0 Закомментируйте заявление части программы, следующим образом:

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

Давайте попробуем следующие примеры:

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

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

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

# и ## операторов

# ## И оператор предварительной обработки в C ++ и ANSI / ISO C в нем имеется. # Оператор лексема замещающей текст будет преобразован в строку в кавычках.

Рассмотрим следующий макрос определение:

#include <iostream>
using namespace std;

#define MKSTR( x ) #x

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

    return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

HELLO C++

Давайте посмотрим, как это работает. Вполне понятно, что C ++ препроцессора следующую строку:

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

В пересчете на:

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

## Операторы используются для соединения двух маркеров. Вот пример:

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

Когда CONCAT появляется в программе, ее параметры будут связаны между собой, и используется для замены макроса. Например, программа CONCAT (ЗДРАВСТВУЙТЕ, C ++) заменяется на "HELLO C ++", как это показано в следующих примерах.

#include <iostream>
using namespace std;

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

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

100

Давайте посмотрим, как это работает. Вполне понятно, что C ++ препроцессора следующую строку:

cout << concat(x, y);

В пересчете на:

cout << xy;

C ++ предопределенные макросы

C ++ приведен в таблице ниже некоторых предопределенных макросов:

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

Давайте посмотрим на эти примеры макросов:

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

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

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