Macro Substitution

C++ препроцессор может определить текстовую замену всюду по всему файлу исходного текста. Это известно как макро-замена. Программисты реализуют макро-замену директивой #define препроцессора, которая может принять следующую форму.

#define identifier replacement-text

Example 1 General form of a #define directive

Используя #define директиву, программист объявляет идентификатор и определяет его текст замены. Макро-замена в файле исходного текста вовлекает препроцессор, заменяющий каждое возникновение идентификатора с текстом замены. Распечатка 2 иллюстрирует макро-определение и использование.

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: #include <iostream>#include <cstdlib> #define MAXIMUM 20 using namespace std; int main(int argc, char* argv[]) { for (int i = 0; i < MAXIMUM; i++) { cout << i << endl; } return EXIT_SUCCESS;}
Listing 2 Macro substitution

Мы можем использовать макро-замену, постоянной переменной. В вышеупомянутой распечатке #define создает идентификатор под названием MAXIMUM, и связывает с этим текст замены 20. Где-нибудь в исходном тексте программы, препроцессор находит MAXIMUM, он заменяет 20. Макро-замена, в этом случае, позволяет MAXIMUM идентификатора функционировать как постоянная переменная.

C++ программисты должен использовать константу ключевого слова вместо макро-замены, чтобы создать постоянные переменные. Поскольку константа ключевого слова - часть C++ язык (и не особенность препроцессора), константы, созданные с этим тип поддержки, лучше чем константы, созданные, используя макро-замену.

C++ препроцессор также поддерживает макроопределение. Использование параметризовавшего макроса очень напоминает нормальную C++ функцию. Препроцессор заменяет очевидный вызов функции макро-текстом замены. Параметризовавшее макро-определение принимает следующую форму.

#define identifier(identifier, identifier, ...) replacement-text

Example 2 General form of a parameterized macro

Следующая распечатка демонстрирует определение и использование параметризовавшего макроса.

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: #include <iostream>#include <cstdlib> #define max(x,y) ( ( (x)>(y) ) ? (x):(y) ) using namespace std; int main(int argc, char* argv[]) { int i = 4; int j = 3; cout << max(i, j) << endl; return EXIT_SUCCESS;}
Listing 3 Parameterized macro

В листинге 3 препроцессор заменяет идентификатор max текстом, "(((x)> (y))? (x): (y)". Во время замены препроцессор заменяет в текст замены текстом, данным как параметры. В линии 13, данные параметры являются "i" и "j". Препроцессор заменяет этим текстом параметры x и y в тексте замены.