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

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

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

#define BIG

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π±Ρ‹Π»Π° Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° лСксСма BIG, ΠΈ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ€Ρ‹. Для ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ прСпроцСссора, ΠΊΠ°ΠΊ #ifdef (Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°) ΠΈ #ifndef (Ссли Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°). Π—Π° ΠΎΠ±Π΅ΠΈΠΌΠΈ

ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° #endif, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠ° (Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобки).

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #ifdef ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎΠ΅ истинС, Ссли тСстируСмая лСксСма ΡƒΠΆΠ΅ Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

#ifdef DEBUG

cout << "Π‘Ρ‚Ρ€ΠΎΠΊΠ° DEBUG ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°"; #endif

Когда прСпроцСссор Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #ifdef, ΠΎΠ½ провСряСт ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΈΠΌ самим Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π±Ρ‹Π»Π° Π»ΠΈ ΡƒΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ лСксСма DEBUG. Если Π΄Π°, Ρ‚ΠΎ #ifdef Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, ΠΈ всС, Ρ‡Ρ‚ΠΎ находится Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #else ΠΈΠ»ΠΈ #endif, записываСтся Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» для компиляции. Если эта Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° строка ΠΊΠΎΠ΄Π°, находящаяся ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ #ifdef DEBUG ΠΈ #endif, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ записана Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Ρ‚.Π΅. Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ этих строк Π½ΠΈΠΊΠΎΠ³Π΄Π° ΠΈ Π½Π΅ Π±Ρ‹Π»ΠΎ Π² исходном ΠΊΠΎΠ΄Π΅.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #ifndef являСтся логичСской ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #ifdef. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #ifndef Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true Π² Ρ‚ΠΎΠΌ случаС, Ссли Π΄ΠΎ этой Ρ‚ΠΎΡ‡ΠΊΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ заданная лСксСма Π½Π΅ Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°.

Комманда прСпроцСссора #else

Как Π²Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»ΠΈ, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #else ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ #ifdef (ΠΈΠ»ΠΈ #ifndef) ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #endif. ИспользованиС этих Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 21.1.

Листинг 21.1. ИспользованиС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #define

1: #define DemoVersion

2: #define NT_VERSION 5

3: #include <iostream.h>

4:

5:

6: int main()

7: {

8:

9:    cout << "Checking on the definitions of DemoVersion, NT_VERSION _and WINDOWS_VERSION...\n";

10:

11:   #ifdef DemoVersion

12:      cout << "DemoVersion defined.\n";

13:   #else

14:      cout << "DemoVersion not defined.\n";

15:   #endif

16:

17:   #ifndef NT_VERSION

18:      cout << "NT_VERSION not defined!\n";

19:   #else

20:      cout << "NT_VERSION defined as: " << NT_VERSION << endl;

21:   #endif

22:  

23:   #ifdef WINDOWS_VERSION

24:      cout << "WINDOWS_VERSION definod!\n";

25:   #else

26:      cout << "WINDOWS_VERSION was nol: do1inod.\n";

27:   #endif

28:

29:   cout << "Done.\n";

30:   return 0;

31: }


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

hecking on the definitions of DemoVersion, NT_VERSION_and

WINDOWS_VERSION...

DemoVersion defined.

NT_VERSION defined as: 5

WINDOWS_VERSION was not defined.

Done.


Анализ: Π’ строках 1 ΠΈ 2 ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ лСксСмы DemoVersion ΠΈ NT_VERSION, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ лСксСмС NT_VERSION назначаСтся Π»ΠΈΡ‚Π΅Ρ€Π°Π» 5. Π’ строкС 11 провСряСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ лСксСмы DemoVersion, Π° ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° (хотя ΠΈ Π±Π΅Π· значСния), Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ тСстирования ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ истинноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ строка 12 Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС.

Π’ строкС 17 ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ лСксСмы NT_VERSION провСряСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #ifndef. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ данная лСксСма ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, возвращаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ продолТаСтся со строки 20. ИмСнно здСсь слово NT_VERSION замСняСтся символом 5, Ρ‚.Π΅. компилятор воспринимаСт эту строку ΠΊΠΎΠ΄Π° Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅:

cout << " NT_VERSION defined as: " << 5 << endl:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ слово Π² сообщСнии NT_VERSION Π½Π΅ замСщаСтся строкой 5, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ тСкстовой строки, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. Но лСксСма NT_VERSION ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Π·Π°ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ΡΡ; Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, компилятор Π²ΠΈΠ΄ΠΈΡ‚ вмСсто Π½Π΅Π΅ символ 5, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Π²Ρ‹ Π²Π²Π΅Π»ΠΈ этот символ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π°.

НаконСц, Π² строкС 23 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° провСряСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ лСксСмы WIND0WS_VERSI0N. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эта лСксСма Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, возвращаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false ΠΈ строкой 26 выводится ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС.

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ошибок Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ main() ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ Π² свой собствСнный Ρ„Π°ΠΉΠ» .cpp, Π° всС Ρ„Π°ΠΉΠ»Ρ‹ .cpp ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Ρ„Π°ΠΉΠ»Ρ‹ .obj, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ связываСт Π² Π΅Π΄ΠΈΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΈΡ… классов, основной Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ„Π°ΠΉΠ»Ρ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² часто Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ². НапримСр, Ρ„Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° с объявлСниСм ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС, Ρ‡Ρ‚ΠΎ класс Animal ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π² Ρ„Π°ΠΉΠ»Π΅ ANIMAL.hpp. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ класс Dog (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ производится ΠΎΡ‚ класса Animal), слСдуСт Π² Ρ„Π°ΠΉΠ» DOG.HPP Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ANIMAL.hpp, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС класс Dog нСльзя Π±ΡƒΠ΄Π΅Ρ‚ произвСсти ΠΎΡ‚ класса Animal. Π€Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Cat Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ANIMAL.hpp ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅.

Если сущСствуСт ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ±Π° класса β€” Cat ΠΈ Dog, Ρ‚ΠΎ Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ с ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒΡŽ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»Π° ANIMAL.hpp. Π­Ρ‚ΠΎ сгСнСрируСт ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² процСссС компиляции, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ класс Animal, Π΄Π°ΠΆΠ΅ нСсмотря Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ объявлСний. Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² прСпроцСссора. Код Ρ„Π°ΠΉΠ»Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ANIMAL Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ:

#ifndef ANIMAL_HPP

#define ANIMAL_HPP

... // Π΄Π°Π»Π΅Π΅ слСдуСт ΠΊΠΎΠ΄ Ρ„Π°ΠΉΠ»Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

#endif

Π­Ρ‚Π° запись ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: Ссли лСксСма ANIMAL_HPP Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ опрСдСляСт эту лСксСму. ΠœΠ΅ΠΆΠ΄Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #define ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠ° условной компиляции #endif Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ содСрТимоС Ρ„Π°ΠΉΠ»Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°.

Когда ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ этот Ρ„Π°ΠΉΠ» Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·, прСпроцСссор Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, оказываСтся истинным, Ρ‚.Π΅. Π΄ΠΎ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° лСксСма Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ ANIMAL_HPP. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° прСпроцСссора #define опрСдСляСт эту лСксСму, послС Ρ‡Π΅Π³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊΠΎΠ΄ Ρ„Π°ΠΉΠ»Π°.

Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ANIMAL,HPP Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·, прСпроцСссор Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FALSE, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ строка ANIMAL.hpp ΡƒΠΆΠ΅ Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ β€” #else (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС таковая отсутствуСт) ΠΈΠ»ΠΈ #endif (которая находится Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„Π°ΠΉΠ»Π°). Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π² этот Ρ€Π°Π· пропускаСтся всС содСрТимоС Ρ„Π°ΠΉΠ»Π° ΠΈ класс Π΄Π²Π°ΠΆΠ΄Ρ‹ Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ.

Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ имя лСксСмы (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ANIMAL_HPP), хотя общСпринято ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π°, записанноС прописными Π±ΡƒΠΊΠ²Π°ΠΌΠΈ, Π° Ρ‚ΠΎΡ‡ΠΊΠ° (.), ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ имя ΠΎΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, замСняСтся ΠΏΡ€ΠΈ этом символом подчСркивания. Однако это Π½Π΅ Π·Π°ΠΊΠΎΠ½, Π° общСпринятоС соглашСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ слСдуСт Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ лишь ΠΊΠ°ΠΊ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ.


ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:Никогда Π½Π΅ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ срСдства Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. НСрСдко ΠΎΠ½ΠΈ способны ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ часы Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ Π½Π° поиск ошибок ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #define ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ дгш создания макросов. ΠœΠ°ΠΊΡ€ΠΎΡ β€” это лСксСма, созданная с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #define. Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ замСняСт строку подстановки Π»ΡŽΠ±Ρ‹ΠΌ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ. НапримСр, ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρƒ TWICE ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

#define TWICE(x) ( (x) * 2 )

А Π·Π°Ρ‚Π΅ΠΌ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку:

TWICE(4)

ЦСлая строка TWICE(4) Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π°, Π° вмСсто Π½Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 8! Когда прСпроцСссор считываСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ 4, ΠΎΠ½ выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ подстановку: ((4) * 2), это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Ρ‚Π΅ΠΌ вычисляСтся ΠΊΠ°ΠΊ 4 * 2 ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получаСтся число 8.

ΠœΠ°ΠΊΡ€ΠΎΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² тСкстС Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Π²Π° часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… макроса β€” МАΠ₯ ΠΈ MIN:

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

#define MIN(x,y) ( (x) < (Ρƒ) ? (x) : (Ρƒ) )

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ макроса ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ круглая скобка для списка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π·Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ макроса, Ρ‚.Π΅. ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ². ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ компилятора, Π½Π΅ ΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ присутствия Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ². Если Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ

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

ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макрос МАΠ₯

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

z = MAX(x,y);

Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

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

z = (x,y) ( (x) > (Ρƒ) ? (x) : (Ρƒ) )(x,y)

Π’ этом случаС сдСлана простая тСкстовая Π·Π°ΠΌΠ΅Π½Π°, Π° Π½Π΅ Π²Ρ‹Π·ΠΎΠ² макроса, Ρ‚.Π΅. лСксСма МАΠ₯ Π±Ρ‹Π»Π° Π·Π°ΠΌΠ΅Π½Π΅Π½Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ (x,y) ( (x) > (Ρƒ) ? (x) : (Ρƒ) ),Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»Π°ΡΡŒ строка (x, Ρƒ).

Однако послС удалСния ΠΏΡ€ΠΎΠ±Π΅Π»Π° ΠΌΠ΅ΠΆΠ΄Ρƒ словом МАΠ₯ ΠΈ списком ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (x,y) ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ выглядит ΡƒΠΆΠ΅ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ:

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

z =7;