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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 121

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π² пространство ΠΈΠΌΠ΅Π½ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ всС объявлСния Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ попадания ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… Π² этом Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π² глобальноС пространство ΠΈΠΌΠ΅Π½. НапримСр:

01 #ifndef SOFTWAREINC_RANDOM_H

02 #define SOFTWAREINC_RANDOM_H

03 namespace SoftwareInc

04 {

05 extern int randomNumbers[128];

06 void populateRandomArray();

07 }

08 #endif

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

Бинтаксис пространства ΠΈΠΌΠ΅Π½ совпадаСт с синтаксисом класса, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ Π½Π΅ ставится Ρ‚ΠΎΡ‡ΠΊΠ° с запятой. НиТС приводится новая вСрсия Ρ„Π°ΠΉΠ»Π° random.cpp:

01 #include "random.h"

02 int SoftwareInc::randomNumbers[128];

03 static int seed = 42;

04 static int nextRandomNumber()

05 {

06 seed = 1009 + (seed * 2011);

07 return seed;

08 }

09 void SoftwareInc::populateRandomArray()

10 {

11 for (int i = 0; i < 128; ++i)

12 randomNumbers[i] = nextRandomNumber();

13 }

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ классов, пространства ΠΈΠΌΠ΅Π½ ΠΌΠΎΠΆΠ½ΠΎ Β«ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΒ» Π² любоС врСмя. НапримСр:

01 namespace Alpha

02 {

03 void alpha1();

04 void alpha2();

05 }

06 namespace Beta

07 {

08 void beta1();

09 }

10 namespace Alpha

11 {

12 void alpha3();

13 }

Π­Ρ‚ΠΎ позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ сотни классов, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Ρ… Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΎΠ΄Π½ΠΎΠΌΡƒ пространству ΠΈΠΌΠ΅Π½. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот ΠΏΡ€ΠΈΠ΅ΠΌ, стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π‘++ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ всС свои ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π² пространство ΠΈΠΌΠ΅Π½ std. Π’ Qt пространства ΠΈΠΌΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠ°ΠΊ Qt::AlignBottom ΠΈ Qt::yellow. По историчСским ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ классы Qt Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΌΡƒ пространству ΠΈΠΌΠ΅Π½, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ прСфикс 'Q'.

Для ссылки Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ пространствС ΠΈΠΌΠ΅Π½, указываСтся прСфикс Π² Π²ΠΈΠ΄Π΅ ΠΈΠΌΠ΅Π½ΠΈ этого пространства ΠΈΠΌΠ΅Π½ (ΠΈ ::). МоТно ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Ρ€Π΅Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², Π½Π°Ρ†Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π½Π° ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ количСства Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… символов:

β€’ МоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ псСвдоним пространства ΠΈΠΌΠ΅Π½:

namespace ElPuebloDeLaReinaDeLosAngeles

{

void beverlyHills();

void culverCity();

void malibu();

void santaMonica();

}

namespace LA = ElPuebloDeLaReinaDeLosAngeles;

ПослС опрСдСлСния псСвдонима ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ вмСсто исходного ΠΈΠΌΠ΅Π½ΠΈ.

β€’ Из пространства ΠΈΠΌΠ΅Π½ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€:

int main()

{

using ElPuebloDeLaReinaDeLosAngeles::beverlyHills;

beverlyHills();

}

ОбъявлСниС using позволяСт ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ Π±Π΅Π· указания прСфикса, состоящСго ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ пространства ΠΈΠΌΠ΅Π½.

β€’ МоТно ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС пространство ΠΈΠΌΠ΅Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹:

int main()

{

using namespace ElPuebloDeLaReinaDeLosAngeles;

santaMonica();

malibu();

}

ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅Π½ становятся Π±ΠΎΠ»Π΅Π΅ вСроятными. Если компилятор «ТалуСтся» Π½Π° двусмыслСнноС имя (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° класса ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ имя, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… пространствах ΠΈΠΌΠ΅Π½), всСгда ΠΏΡ€ΠΈ ссылкС Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π΅ΠΌ пространства ΠΈΠΌΠ΅Π½.

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ Π‘++ β€” это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ исходный Ρ„Π°ΠΉΠ» .cpp, содСрТащий Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ # (Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ #include, #ifndef ΠΈ #endif), ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Ρ„Π°ΠΉΠ» исходного ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ содСрТит Ρ‚Π°ΠΊΠΈΡ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ². Π­Ρ‚ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для выполнСния простых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с тСкстом исходного Ρ„Π°ΠΉΠ»Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для выполнСния условной компиляции, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»Π° ΠΈ разворачивания макроса. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ прСпроцСссор автоматичСски вызываСтся компилятором, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ систСм прСдусмотрСна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ нСпосрСдствСнного Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° (часто для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ опция компилятора β€”E ΠΈ /E).

β€’ Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #include разворачиваСтся Π² содСрТимоС Ρ„Π°ΠΉΠ»Π°, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ указываСтся Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках (< >) ΠΈΠ»ΠΈ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… (" "), Π² зависимости ΠΎΡ‚ располоТСния Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² стандартном ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΈΠ»ΠΈ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Имя Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ .. ΠΈ / (этот символ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ интСрпрСтируСтся компиляторами Windows ΠΊΠ°ΠΊ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²). НапримСр:

#include "../shared/globaldefs.h"

β€’ Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #define опрСдСляСтся макрос. КаТдоС появлСниС Π² тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠΌΠ΅Π½ΠΈ, располоТСнном послС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #define, замСняСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ для Π½Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. НапримСр, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°

#define PI 3.14159265359

ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ прСпроцСссору Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ появлСния Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ компиляции лСксСмы PI лСксСмой 3.14159265359. Для прСдотвращСния ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΈΠΌΠ΅Π½ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ классами ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ стало Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ макросам ΠΈΠΌΠ΅Π½, состоящих Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· прописных Π±ΡƒΠΊΠ². МоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ макрос с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ:

#define SQUARE(x) ((x) * (x))

БчитаСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ стилСм ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ‚Π΅Π»Π΅ макроса скобками Π»ΡŽΠ±Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ всСго Ρ‚Π΅Π»Π° макроса, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ запись 7 * SQUARE(2 + 3) Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π»Π°ΡΡŒ Π² 7 * ((2 + 3) * (2 + Π—)), Π° Π½Π΅ Π² 7 * 2 + 3 * 2 + 3.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹ Π‘++ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ макросы Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΡ†ΠΈΡŽ β€”D ΠΈΠ»ΠΈ /D. НапримСр:

CC -DPI=3.14159265359 -с main.cpp

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π±Ρ‹Π»ΠΈ ΠΎΡ‡Π΅Π½ΡŒ популярны Π² ΠΏΡ€Π΅ΠΆΠ½ΠΈΠ΅ Π΄Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ Π²Π²Π΅Π΄Π΅Π½Ρ‹ typedef, пСрСчислСния, константы, встраиваСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹. Π’ наши Π΄Π½ΠΈ ΠΎΠ½ΠΈ ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹Ρ… Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

β€’ ΠœΠ°ΠΊΡ€ΠΎΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² любом мСстС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #undef:

#undef PI

Π­Ρ‚Ρƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ссли трСбуСтся ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ макрос, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ прСпроцСссор Π½Π΅ позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ макрос Π΄Π²Π°ΠΆΠ΄Ρ‹. Π­Ρ‚Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для управлСния условной компиляциСй.

β€’ ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² #if, #elif, #else ΠΈ #endif Π² зависимости ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… числовых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ макросов. НапримСр:

#define NO_OPTIM 0

#define OPTIM_FOR_SPEED 1

#define OPTIM_FOR_MEMORY 2

#define OPTIMIZATION OPTIM_FOR_MEMORY

…

#if OPTIMIZATION == OPTIM_FOR_SPEED

typedef int MyInt;

#elif OPTIMIZATION == OPTIM_FOR_MEMORY

typedef short MyInt;

#else

typedef long long MyInt;

#endif

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ компилятором Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ объявлСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ синоним для short. ИзмСняя ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ макроса OPTIMIZATION, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если макрос Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.

Π”Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ условной компиляции являСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° макроса Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Π΅Π³ΠΎ опрСдСлСния. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ defined():

#define OPTIM_FOR_MEMORY

…

#if defined(OPTIM_FOR_SPEED)

typedef int MyInt;

#elif defined(OPTIM_FOR_MEMORY)

typedef short MyInt;

#else

typedef long long MyInt;

#endif

β€’ Π Π°Π΄ΠΈ удобства прСпроцСссор воспринимаСт #ifdef X ΠΈ #ifndef X ΠΊΠ°ΠΊ синонимы #if defined(X) ΠΈ #if !defined(X). Для ΠΏpeΠ΄oΡ‚Π²paΡ‰eния ΠΌΠ½oΠ³oΠΊpaΡ‚Π½Ρ‹x Π²ΠΊΠ»ΡŽΡ‡eΠ½ΠΈΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΌΡ‹ ΠΎΠΊΡ€ΡƒΠΆΠ°Π΅ΠΌ Π΅Π³ΠΎ содСрТимоС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ:

#ifndef MYHEADERFILE_H

#define MYHEADERFILE_H

…

#endif

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° символ MYHEADERFILE_H оказываСтся Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ, поэтому компилятор ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ #ifndef ΠΈ #endif. ΠŸΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΡ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° символ MYHEADERFILE_H оказываСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ, поэтому вСсь Π±Π»ΠΎΠΊ #ifndef … #endif пропускаСтся.

β€’ Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #errΠΎr Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° этапС компиляции ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ сообщСниС ΠΎΠ± ошибкС. Π­Ρ‚Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ условной компиляции для Π²Ρ‹Π²ΠΎΠ΄Π° сообщСния ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ нСдопустимого условия. НапримСр:

class UniChar

{

public:

#if BYTE_ORDER == BIG_ENDIAN

uchar row;