int MyNumbers [25] = {0};
|
// массив из 25
|
целых
|
чисел
|
|
double Radiuses [25] = {0.0};
|
// массив из
|
25
|
чисел
|
типа double
|
|
std::string Names [25];
|
// массив из
|
25
|
std::strings
|
|
Замена применима к любому разделу кода, включая такой цикл f o r , как этот:
for(int Index = 0; Index < ARRAY_LENGTH; ++Index)
MyNumbers[Index] = Index;
Этот цикл f o r видим компилятору так:
for(int Index = 0; Index < 25; ++Index)
MyNumbers[Index] = Index;
Чтобы увидеть все это в действии, рассмотрим листинг 14.1.
ЛИСТИНГ 14.1. Объявление и использование макроса, определяющего константы
tinclude
#include
using namespace std;
#define ARRAY_LENGTH 25
#define PI 3.1416
#define MYJXXJBLE double
#define FAV_WHISKY "Jack Daniels"
8 :
int main()
10: {
int MyNumbers [ARRAY_LENGTH] = {0};
12: cout « "Array's length: " « sizeof(MyNumbers) / sizeof(int)
endl;
13:
cout « "Enter a radius: ";
MY_DOUBLE Radius = 0;
cin » Radius;
cout « "Area is: " « PI * Radius * Radius « endl;
string FavoriteWhisky (FAV_WHISKY);
20: cout « "My favorite drink is: " « FAV_WHISKY « endl;
2 1 :
return 0;
}
Результат
Array's length: 25
Enter a radius: 2.1569
Area is: 14.7154
My favorite drink is: Jack Daniels
Анализ
ARRAY_LENGTH, P I, MY_DOUBLE и FAV_WHISKY являются четырьмя макро-константами, определенными в строках 3-7 соответственно. Как можно заметить, первая используется
12 3ак. 3626
354 ЗАНЯТИЕ 14. Макросы и шаблоны
при определении длины массива в строке 11, которая проверяется при помощи оператора s i z e o f () в строке 12. Константа MY_DOUBLE используется при объявлении переменный R a d iu s типа d o u b le в строке 15, а константа P I используется при вычислении площади круга в строке 17. И наконец, константа FAV_W H ISKY используется при инициализации объекта класса s t d : : s t r i n g в строке 19 и непосредственно используется в операторе c o u t (строка 20). Все эти случаи демонстрируют, что препроцессор просто осуществляет текстовую замену.
такой “тупой” текстовой замены, которая, кажется, нашла повсеместное применение
листинге 14.1, есть также и недостатки.
Поскольку препроцессор делает лишь текстовую подстановку, он позволяет вам совершать ошибки (которые компилятор не всегда выявляет). Вы могли бы определить константу F A V _W H I S K Y в строке 7 листинга 14.1 так:
#define FAV_WHISKY 42 // "Jack Daniels"
Это может закончиться ошибкой компиляции в строке 19 при создании экзем пляра класса std::string, а может и нет, тогда компилятор продолжит работу и выведет следующее:
Му favorite drink is: 42
Это, конечно, не имело бы смысла, но важней всего то, что осталось бы необна руженным. Кроме того, вы не имеете особого контроля над определением такой константы P I :будет ли она иметь тип double или float? Ответ: ни тот ни дру гой. PI для препроцессора - это только текст, заменяемый текстом “3.1416й. Ни о каком типе данных нет и речи.
Константы лучше определять, используя ключевое слово const с типами дан ных. Так намного лучше:
Do'stlaringiz bilan baham: |