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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹ программирования Π½Π° Π‘++. 101 ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈ рСкомСндация». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 12

Автор Π“Π΅Ρ€Π± Π‘Π°Ρ‚Ρ‚Π΅Ρ€

ΠŸΡ€ΠΈΠΌΠ΅Ρ€. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° инстанцирования шаблона макросу. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π² достаточной ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки. Π’ Π‘++, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° новая конструкция с ΡƒΠ³Π»ΠΎΠ²Ρ‹ΠΌΠΈ скобками, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ…. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²

macro(Foo<int, double>)

макрос воспринимаСт Ρ‚Π°ΠΊ, Π±ΡƒΠ΄Ρ‚ΠΎ Π΅ΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Foo<int ΠΈ doublΠ΅>, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ эта конструкция прСдставляСт собой Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π‘++.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ СдинствСнно Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π°ΠΆΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π·Π°Ρ‰ΠΈΡ‚Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #include (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 24), использованиС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² #ifdef ΠΈ #if defined для условной компиляции ΠΈ рСализация assert (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 68).

ΠŸΡ€ΠΈ условной компиляции (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, систСмно-зависимых частСй) ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ разброса ΠΏΠΎ всСму тСксту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² #ifdef. ВмСсто этого Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ использованиС макросов обСспСчивало Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ интСрфСйса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

МоТно (Π½ΠΎ остороТно) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы вмСсто большого количСства ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΉ ΠΈ вставок Π±Π»ΠΈΠ·ΠΊΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π°.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ [C99] ΠΈ [Boost] Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ соотвСтствСнно ΡƒΠΌΠ΅Ρ€Π΅Π½Π½Ρ‹Π΅ ΠΈ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ прСпроцСссоров.

Бсылки

[Boost] β€’ [Π‘99] β€’ [Dewhurst03] Β§25-28 β€’ [Lakos96] Β§2.3.4 β€’ [Meyers96] Β§1 β€’ [Stroustrup94] Β§3.3.1 β€’ [Stroustrup00] Β§1.6.1, Β§7.8 β€’ [Sutter02] Β§34-35 β€’ [Sutter04] Β§31 β€’ [Sutter04a]

17. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ магичСских чисСл

РСзюмС

Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ использования Π² ΠΊΠΎΠ΄Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… констант Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ 42 ΠΈΠ»ΠΈ 3.1415926. Π’Π°ΠΊΠΈΠ΅ константы Π½Π΅ самоочСвидны ΠΈ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡŽΡ‚ сопровоТдСниС ΠΊΠΎΠ΄Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вносят Π² Π½Π΅Π³ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌΡ‹ΠΉ Π²ΠΈΠ΄ дублирования. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ вмСсто Π½ΠΈΡ… ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΈ выраТСния Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ width*aspectRatiΠΎ.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ИмСна Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈ вводят Π΅Π΄ΠΈΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ сопровоТдСния; Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π½ΠΈΡ… Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ числа Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ сопровоТдаСмы. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ пСрСчислСниями ΠΈΠ»ΠΈ const-значСниями, с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ областями видимости ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ.

Одно число 42 ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π΅ΠΌ ΠΆΠ΅ числом 42, Ρ‡Ρ‚ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π§Ρ‚ΠΎ Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, программист ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ вычислСния "Π² ΡƒΠΌΠ΅" (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: "Π’ΠΎΡ‚ это 84 β€” просто ΡƒΠ΄Π²ΠΎΠ΅Π½Π½ΠΎΠ΅ 42, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΡΡ‚ΡŒΡŽ строками Ρ€Π°Π½Π΅Π΅"), Ρ‡Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π·Π°ΠΏΡƒΡ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°ΠΌΠ΅Π½Ρƒ 42 Π΄Ρ€ΡƒΠ³ΠΎΠΉ константой источником ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ количСства ошибок.

Π›ΡƒΡ‡ΡˆΠ΅ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ТСстко ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ константами. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π»ΡƒΡ‡ΡˆΠ΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ ΠΊΠΎΠ΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ .срр-Ρ„Π°ΠΉΠ»Π΅ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Π΅ рСсурса), Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ нСпрограммистам ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡ…, сниТая количСство Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² ΠΈ помогая Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. Π’Π°ΠΆΠ½Ρ‹Π΅ константы ΠΈΠ· ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ пространств ΠΈΠΌΠ΅Π½.

const size_t PAGE_SIZE = 8192,

             WORDS_PER_PAGE = PAGE_SIZE / sizeof(int),

             INFO_BITS_PER_PAGE = 32 * CHAR_BIT;

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹, спСцифичныС для Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ статичСскиС ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Π»ΡŒΠ½Ρ‹Π΅ константы Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса; константы Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ опрСдСлСния ΠΈΠ»ΠΈ примСнСния ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

// Π€Π°ΠΉΠ» widget.h

class Widget {

 // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² объявлСнии

 static const int defaultWidth = 400;

 // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ

 static const double defaultPercent;

 static const char* Name() { return "widget"; }

};


// Π€Π°ΠΉΠ» widget.cpp

// Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ

const double widget::defaultPercent = 66.67;

// ВрСбуСтся объявлСниС

const int widget::defaultWidth;

Бсылки

[Dewhurst03] Β§2 β€’ [Kernighan99] Β§1.5 β€’ [Stroustrup00] Β§4.8, Β§5.4

18. ΠžΠ±ΡŠΡΠ²Π»ΡΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ локальнСС

РСзюмС

Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ "раздувания" областСй видимости. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ мСньшС, Π° врСмя ΠΈΡ… ΠΆΠΈΠ·Π½ΠΈ β€” ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΡ€ΠΎΡ‡Π΅. Π­Ρ‚Π° рСкомСндация ΠΏΠΎ сути являСтся частным случаСм Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ 10.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, врСмя ΠΆΠΈΠ·Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅, ΠΈΠΌΠ΅ΡŽΡ‚ ряд нСдостатков.

β€’ ΠžΠ½ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ ΠΈ сопровоТдаСмой. НапримСр, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ ΠΊΠΎΠ΄ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ строку path Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ модуля, Ссли ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ диск?

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

β€’ ΠžΠ½ΠΈ Π½Π΅ всСгда ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. Никогда Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ смоТСтС ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. НСинициализированныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ β€” источник "Ρ€Π°ΡΠΏΠΎΠ»Π·Π°ΡŽΡ‰ΠΈΡ…ΡΡ" ошибок Π²ΠΎ всСх ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π‘ ΠΈ Π‘++, ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ особого внимания Π² связи с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ всСгда ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ компилятором (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 19).

Π’ частности, старыС вСрсии языка Π‘ Π΄ΠΎ [C99] Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½Π°Ρ‡Π°Π»Π΅ области видимости; Ρ‚Π°ΠΊΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ Π² Π‘++ Π²Ρ‹ΡˆΠ΅Π» ΠΈΠ· употрСблСния. Π‘Π΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚Π°ΠΊΠΎΠ³ΠΎ ограничСния состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π² Π½Π°Ρ‡Π°Π»Π΅ области видимости Π½Π΅ имССтся достаточной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρƒ вас остаСтся Π΄Π²Π° Π²Ρ‹Ρ…ΠΎΠ΄Π° β€” Π»ΠΈΠ±ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΡƒΠ»Π΅ΠΌ), Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°ΡΡ‚ΠΎΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкам (Ссли пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ использована Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ осмыслСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅), Π»ΠΈΠ±ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎ опасно. НСинициализированная пСрСмСнная ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ°ΠΌΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ пустым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

Π›Π΅Ρ‡Π΅Π½ΠΈΠ΅ этой Π±ΠΎΠ»Π΅Π·Π½ΠΈ ΠΎΡ‡Π΅Π½ΡŒ простоС β€” опрСдСляйтС ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ локально, насколько ΠΌΠΎΠΆΠ΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΡƒ нСпосрСдствСнноС ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ использованиСм, ΠΊΠΎΠ³Π΄Π° Ρƒ вас ΡƒΠΆΠ΅ достаточно Π΄Π°Π½Π½Ρ‹Ρ… для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Иногда с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π³ΠΎΠ΄Π½Ρ‹ΠΌ вынСсСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Ρ†ΠΈΠΊΠ»Π° (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 9).

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ константы Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ состояния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, данная рСкомСндация Π½Π° Π½ΠΈΡ… Π½Π΅ распространяСтся (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 17).

Бсылки

[Dewhurst03] Β§3, Β§48, Β§66 β€’ [Dewhurst03] Β§95 [McConnell93] Β§5.1-4, Β§10.1 β€’ [Stroustrup00] Β§4.9.4, Β§6.3

19. ВсСгда ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

РСзюмС

НСинициализированныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ β€” распространСнный источник ошибок Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π° Π‘ ΠΈ Π‘++. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΈΡ…, Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚Π°Π² ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡ΠΊΡƒ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π΅ использованиСм; ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈ ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Π’ традициях Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ эффСктивности Π‘++ (ΠΊΠ°ΠΊ ΠΈ Π‘), ΠΎΡ‚ компилятора Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π½Π΅ трСбуСтся инициализация ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ сдСлаСтС это явно (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ‡Π»Π΅Π½Ρ‹, ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора). Π’Π°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π°Π΄ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ явно.

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ нСсколько ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ пСрСмСнная ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ. Но Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ… Π½Π΅ являСтся достаточно ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠΉ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π°Π²Π΄Π°Ρ‚ΡŒ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ повСдСния.

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ язык (Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ Pascal, Π‘, Fortran ΠΈΠ»ΠΈ Cobol), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ ΠΊΠΎΠ΄Π°, ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ, ΠΈ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΈΠΌ значСния ΠΏΠΎΠ·ΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ устарСл ΠΈ Π½Π΅ рСкомСндуСтся для использования (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 18).

РаспространСнноС Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ приводят ΠΊ ΠΊΡ€Π°Ρ…Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ нСсколько Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… быстро ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ простым тСстированиСм. На самом Π΄Π΅Π»Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Π΅Π·ΡƒΠΊΠΎΡ€ΠΈΠ·Π½Π΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π³ΠΎΠ΄Π°ΠΌΠΈ, Ссли Π±ΠΈΡ‚Ρ‹ Π² памяти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ трСбованиям ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ПозТС Π²Ρ‹Π·ΠΎΠ² с Π΄Ρ€ΡƒΠ³ΠΈΠΌ контСкстом, пСрСкомпиляция ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ измСнСния Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ послСдствиям Ρ€Π°Π·Π½ΠΎΠΉ стСпСни тяТСсти β€” ΠΎΡ‚ нСобъяснимого повСдСния Π΄ΠΎ пСриодичСского Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. ИспользованиС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ?: для сниТСния стСпСни смСшивания ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° управлСния.

// НС рСкомСндуСтся: Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ

int speedupFactor;

if (condition)

 speedupFactor = 2;

else

 speedupFactor = -1;


// Π›ΡƒΡ‡ΡˆΠ΅: ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ

int speedupFactor = -1;

if (condition)

 speedupFactor = 2;