Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Освой ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π‘++ Π·Π° 21 дСнь.Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 146

Автор ДТСсс Π›ΠΈΠ±Π΅Ρ€Ρ‚ΠΈ

int x = 5, Ρƒ = 7, z;

z =7;

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ всС эти ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки

Π’Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странным, Ρ‡Ρ‚ΠΎ Π² макросах ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок. На самом Π΄Π΅Π»Π΅ прСпроцСссор совсСм Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² строкС подстановки ΡΡ‚Π°Π²ΠΈΠ»ΠΈΡΡŒ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки, Π½ΠΎ эти скобки ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ макросу слоТных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. НапримСр, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ МАΠ₯ ΠΊΠ°ΠΊ

#define MAX(x,y) x > Ρƒ ? x : Ρƒ

ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ значСния 5 ΠΈ 7, Ρ‚ΠΎ макрос МАΠ₯ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Но Ссли ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТныС выраТСния, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 21.2.

Листинг 21.2. ИспользованиС Π² макросС ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок

1: // Листинг 21.2. ИспользованиС Π² макросС ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок

2: #include <iostream.h>

3:

4: #define CUBE(a) ( (Π°) * (Π°) << (Π°) )

5: #define THREE(a) Π° * Π° * Π° 6:

7: int main()

8: {

9:    long x = 5;

10:   long Ρƒ = CUBE(x);

11:   long z = THREE(x);

12:

13:   cout << "Ρƒ: " << Ρƒ << endl;

14:   cout << "z: " << z << endl;

15:

16:   long Π° = 5, b = 7;

17:   Ρƒ = CUBE(a+b);

18:   z = THREE(a+b);

19:

20:   cout << "Ρƒ: " << Ρƒ << endl;

21:   cout << "z: " << z << endl;

22:   return 0;

23: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Ρƒ: 125

z: 125

Ρƒ: 1728

z: 82


Анализ: Π’ строкС 4 опрСдСляСтся макрос CUBE с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ x, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π΅Π³ΠΎ использовании Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ. Π’ строкС 5 опрСдСляСтся макрос THREE, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±Π΅Π· ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок.

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ использовании этих макросов ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ пСрСдаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5, ΠΈ ΠΎΠ±Π° макроса прСкрасно ΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ со своСй Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ. ΠœΠ°ΠΊΡ€ΠΎΡ CUBE(5) прСобразуСтся Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ( (5) * (5) * (5) ), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈ вычислСнии Π΄Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 125, Π° макрос THREE(5) прСобразуСтся Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 5 * 5 * 5, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 125.

ΠŸΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ этим макросам Π² строках 16β€”18 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ пСрСдаСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 5 + 7. Π’ этом случаС макрос CUBE(5+7) прСобразуСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

( (5+7) * (5+7) * (5+7) )

Оно соотвСтствуСт Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ

( (12) * (12) * (12) )

ΠŸΡ€ΠΈ вычислСнии этого выраТСния ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1728. Однако макрос THREE(5+7) прСобразуСтся Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°:

5 + 7 * 5 + 7 * 5 + 7

А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ опСрация умноТСния ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ высокий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ слоТСния, Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ эквивалСнтно ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ:

5 + (7 * 5) + (7 * 5) + 7

ПослС вычислСния ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΉ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

5 + (35) + (35) + 7

ПослС суммирования ΠΎΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 82.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π² сравнСнии с функциями шаблонов

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с макросами ΠΈ языкС C++ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ. ΠŸΠ΅Ρ€Π²Π°Ρ состоит Π² Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… нСудобствах ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ самого выраТСния макроса, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ любой макрос Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² ΠΎΠ΄Π½ΠΎΠΉ строкС. БСзусловно, эту строку ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄Π»ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ символа ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ косой Ρ‡Π΅Ρ€Ρ‚Ρ‹ (\), Π½ΠΎ большиС макросы слоТны для понимания ΠΈ с Π½ΠΈΠΌΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

Вторая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ макросы Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡƒΡ‚Π΅ΠΌ подстановки ΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли макрос ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ 12 Ρ€Π°Π·, Ρ‚ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ Ρ€Π°Π· Π½ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ вставлСно ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ). Π₯отя, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, подставляСмыС выраТСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ быстрСС, Ρ‡Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ тратится врСмя ΠΏΠ° само ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ макросы Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡƒΡ‚Π΅ΠΌ подстановки Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, которая проявляСтся Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ макросы ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² исходном ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌ компилятором для Π΅Π΅ тСстирования. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ сущСствСнно Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Однако Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ сущСствСнна послСдняя ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π² макросах Π½Π΅ поддСрТиваСтся ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° соотвСтствиСм Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. Π₯отя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования Π² макросС Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ любого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° каТСтся ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ, этот Ρ„Π°ΠΊΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ΄Ρ€Ρ‹Π²Π°Π΅Ρ‚ строгий ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Ρ‚ΠΈΠΏΠΎΠ² Π² C++ ΠΈ являСтся проклятиСм для программистов Π½Π° C++. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, сущСствуСт ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ способ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ β€” Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ услугами шаблонов, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° занятии 19.

ΠŸΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΠ΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Часто вмСсто макросов ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΠ΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. НапримСр, Π² листингС 21.3 создаСтся функция CUBE, которая выполняСт Ρ‚Ρƒ ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Ρ‡Ρ‚ΠΎ ΠΈ макрос CUBE Π² листингС 21.2, Π½ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС это дСлаСтся способом, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° соотвСтствиСм Ρ‚ΠΈΠΏΠΎΠ².

Листинг 21.3. ИспользованиС подставляСмой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вмСсто макроса

1: #include <iostream.h>

2:

3: inline unsigned long Square(unsigncd long Π°) { return Π° * Π°; }

4: inline unsigned long Cubo(unsigned long Π°)

5: { return Π° * Π° * Π°; }

6: int main()

7: {

8:    unsigned long x=1 ;

9:    for (;;)

10:   {

11:      cout << "Enter Π° number (0 to quit): ";

12:      cin >> x;

13:      if (x == 0)

14:         break;

15:      cout << "You entered: " << x;

16:      cout << ". Square(" << x << "): ";

17:      cout << Square(x);

18:      cout<< ". Cube(" << x << "): ";

19:      cout << Cube(x) << "." << endl;

20:   }

21:   return 0;

22: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Enter Π° number (0 to quit) 1  

You ent.erod: 1. Square(1) 1. Cube(1): 1.

Enter Π° number (0 t.o quit) 2  

You entered: 2. Square(2) 4. Cube(2): 8

Enter a number (0 t.o quit.) 3  

You enlered: 3. Square(3) 9. Cube(3): 27.

Enter a number (0 to quit) 4  

You entered: 4. Squate(4) 16 Cube(4) 64.

Enter a number (0 to quit) 5  

You entered: 5, Squate(5) 25 Cubo(5) 125

Enter a number (0 to qu.it) 6  

You entered: 6. Squaro(6) 36 Cube(6) 216

Enter a number (0 to quit) 0  


Анализ: Π’ строках 3 ΠΈ 4 ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π΅ подставляСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: Square() ΠΈ Cube(). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ подставляСмыми с помошью ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова inlino, ΠΎΠ½ΠΈ, ΠΊΠ°ΠΊ ΠΈ макросы, Π±ΡƒΠ΄ΡƒΡ‚ вставлСны Π² ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ мСсту ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, связанных с обращСниями ΠΊ функциям, Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚.

Напомним, Ρ‡Ρ‚ΠΎ подставляСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π²ΠΎ врСмя компиляции Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π²ΡΡŽΠ΄Ρƒ, Π³Π΄Π΅ дСлаСтся ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² строкС 17). А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ происходит, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹, связанныС с ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π² стСк адрСса Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ строкС 17 вызываСтся функция Square, Π° Π² строкС 19 β€” функция Cube. И вновь-Ρ‚Π°ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ подставляСмыС, Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ строка ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π° послС компиляции Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

16: cout << ". Square(" << x << "): " << x * x << ". Cube (" << x << "): " << x * x * x << "." << endl;

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со строками

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ прСдоставляСт Π΄Π²Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° для управлСния строками Π² макросах. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ взятия Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ (#) Π±Π΅Ρ€Π΅Ρ‚ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ Π»ΡŽΠ±ΡƒΡŽ строку, которая слСдуСт Π·Π° Π½ΠΈΠΌ. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ (##) ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Π΄Π²Π΅ строки Π² ΠΎΠ΄Π½Ρƒ.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ взятия Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ

Π­Ρ‚ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π±Π΅Ρ€Π΅Ρ‚ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ Π»ΡŽΠ±Ρ‹Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π° Π½ΠΈΠΌ символы Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ символа ΠΏΡ€ΠΎΠ±Π΅Π»Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ

#define WRITESTRING(x) cout << #x

ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² макроса:

WRITESTRING(This is Π° string);

Ρ‚ΠΎ прСпроцСссор ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π΅Π³ΠΎ Π² Ρ‚Π°ΠΊΡƒΡŽ строку ΠΊΠΎΠ΄Π°:

cout << "This is Π° string";

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ строка This is Π° string Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ трСбуСтся для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° cout.

ΠšΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡ

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ позволяСт ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ нСсколько строк Π² ΠΎΠ΄Π½Ρƒ. Новая строка Π½Π° самом Π΄Π΅Π»Π΅ прСдставляСт собой лСксСму, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ имя класса, имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, смСщСниС Π² массивС ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, Π³Π΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ ряд символов.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π½Π° ΠΌΠ³Π½ΠΎΠ²Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΏΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΠΊΠ°ΠΊ fOnePrint, fTwoPrint, fThreePrint, fFourPrint ΠΈ fFivePrint. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ объявлСниС:

#define fPRINT(x) f ## x ## Print

Π—Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макрос fPRINT(x) с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Two, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку fTwoPrint, ΠΈ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Three, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку fThreePrint.

Π’ ΠΊΠΎΠ½Ρ†Π΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Π΄Π΅Π»ΠΈ обучСния Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ класс PartsList. Π­Ρ‚ΠΎΡ‚ список ΠΌΠΎΠ³ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΈΠΏΠ° List. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ этот список Π·Π°Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» сСбя Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ ΠΈ Π²Π°ΠΌ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ списки ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ…, Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ, ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² ΠΈ Ρ‚.Π΄.

Один ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠ³ Π±Ρ‹ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ Π² создании списков AnimalList, CarList, ComputerList ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Ρ€Π΅Π·ΠΊΠΈ ΠΈ вставки ΠΊΠΎΠ΄Π° Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ мСсто. Однако Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ быстро ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π²Π°ΡˆΡƒ Тизнь Π² ΠΊΠΎΡˆΠΌΠ°Ρ€, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, вносимоС Π² ΠΎΠ΄ΠΈΠ½ список, Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π½ΠΎΡΠΈΡ‚ΡŒ Π²ΠΎ всС Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

Но, ΠΊ ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, сущСствуСт Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” использованиС макросов ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ макрос:

#define Listof(Type) class Type##List

{

   public: