Лучшее руководство по C ++ препроцессор в 2024 году. В этом руководстве вы можете изучить #define предварительная обработка,Макро Функции,Условная компиляция,# и ## операторов,C ++ предопределенные макросы,
Некоторые директивы препроцессора, направляет препроцессор компилятора до фактической компиляции, которые необходимо выполнить.
Все директивы препроцессора (#), начиная со знака фунта, только символ пробела может появиться перед директивами препроцессора. Директива препроцессора C ++ не является утверждением, так что они не являются точкой с запятой, а в конце ().
Мы видели все предыдущие экземпляры имеют#include директивы.Этот макрос используется файл заголовка будет включен в исходный файл.
C ++ также поддерживает ряд директив предварительной обработки, таких как # включают, # определить, # если, # # еще, линии и т.д., давайте посмотрим на эти важные инструкции.
#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 ru. 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 ++ приведен в таблице ниже некоторых предопределенных макросов:
宏 | 描述 |
---|---|
__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