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

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

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

void using k_and_r_style() {

 // ...

}

void putting_each_brace_on_its_own_line()

{

 // ...

}

void or_putting_each_brace_on_its_own_line_indented()

 {

  // ...

 }

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. ΠŸΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈΠ»ΠΈ табуляция. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… использованиС табуляции Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, [BoostLRG]) Π½Π° Ρ‚ΠΎΠΌ основании, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ табуляции Π²Π°Ρ€ΡŒΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‚ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° ΠΊ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρƒ, Π° это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ отступы ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ слишком ΠΌΠ°Π»Ρ‹ ΠΈΠ»ΠΈ слишком Π²Π΅Π»ΠΈΠΊΠΈ. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… табуляции Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹. Π’Π°ΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Если Π²Ρ‹ позволяСтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±ΡƒΠ»ΡΡ†ΠΈΡŽ, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ ясности ΠΊΠΎΠ΄Π° ΠΈ Π΅Π³ΠΎ удобочитаСмости, Ссли Ρ‡Π»Π΅Π½Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π° (см. руководство 6). Если использованиС табуляции Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρƒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ Π² табуляции ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ исходного Ρ„Π°ΠΉΠ»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ программисты ΠΌΠΎΠ³Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅. Однако ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ сохранСнии Ρ„Π°ΠΉΠ»Π°

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3. ВСнгСрская запись. Π—Π°ΠΏΠΈΡΡŒ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ информация ΠΎ Ρ‚ΠΈΠΏΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, приносит ΠΏΠΎΠ»ΡŒΠ·Ρƒ Π² языкС программирования, нСбСзопасном с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ‚ΠΈΠΏΠΎΠ² (особСнно Π² Π‘); Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°, хотя ΠΈ Π½Π΅ приносит Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·Ρ‹ (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСдостатки) Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языках; ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Π² ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, стандарт кодирования Π‘++ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ использования вСнгСрской записи, Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ Π·Π°ΠΏΡ€Π΅Ρ‚Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4. Один Π²Ρ…ΠΎΠ΄, ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Ρ…ΠΎΠ΄ (Single entry, single exit β€” "SESE"). Π˜ΡΡ‚ΠΎΡ€ΠΈΡ‡Π΅ΡΠΊΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стандарты кодирования Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ каТдая функция ΠΈΠΌΠ΅Π»Π° Π² точности ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Ρ…ΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ return. Π’Π°ΠΊΠΎΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ являСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ Π² языках, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ дСструкторы, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ нСсколько нСявных Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠ². ВмСсто этого стоит ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ стандарту Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ 5, которая Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ простоты ΠΈ краткости, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΡ… Π±ΠΎΠ»Π΅Π΅ простыми для понимания

Бсылки

[BoostLRG] β€’ [Brooks95] Β§12 β€’ [Constantine95] Β§29 β€’ [Keffer95] p. 1 β€’ [Kernighan99] Β§1.1, Β§1.3, Β§1.6-7 β€’ [Lakos96] Β§1.4.1, Β§2.7 β€’ [McConnell93] Β§9, Β§19 β€’ [Stroustrup94] Β§4.2-3 β€’ [Stroustrup00] Β§4.9.3, Β§6.4, Β§7.8, Β§Π‘.1 [Sutter00] Β§6.1, Β§20 [SuttHysl01]

1. ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π±Π΅Π· Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ ΠΏΡ€ΠΈ максимальном ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ

РСзюмС

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ прСдупрСТдСниям компилятора ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ вашим компилятором. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ всС Π²Ρ‹Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ прСдупрСТдСния ΠΈ ΡƒΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈΡ… ΠΏΡƒΡ‚Π΅ΠΌ измСнСния ΠΊΠΎΠ΄Π°, Π° Π½Π΅ сниТСния уровня Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ.

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

Π’Π°Ρˆ компилятор β€” ваш Π΄Ρ€ΡƒΠ³. Если ΠΎΠ½ Π²Ρ‹Π΄Π°Π» ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ конструкции, Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ это Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ Π² вашСм ΠΊΠΎΠ΄Π΅.

УспСшная сборка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΠΎΠ»Ρ‡Π° (Π±Π΅Π· ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ). Если это Π½Π΅ Ρ‚Π°ΠΊ, Π²Ρ‹ быстро ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡ΠΊΡƒ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒ внимания Π½Π° Π²Ρ‹Π²ΠΎΠ΄ компилятора ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 2).

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

Π”Π΅Π»Π°ΠΉΡ‚Π΅ это всСгда β€” Π΄Π°ΠΆΠ΅ Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выглядит ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ. Π”Π΅Π»Π°ΠΉΡ‚Π΅ это, Π΄Π°ΠΆΠ΅ Ссли ΡƒΠ±Π΅Π΄ΠΈΠ»ΠΈΡΡŒ Π² мягкости прСдупрСТдСния. Π”Π°ΠΆΠ΅ Π»Π΅Π³ΠΊΠΈΠ΅ прСдупрСТдСния ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ прСдупрСТдСния, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ.

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» стороннСго производитСля. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ (вСроятно, ΠΌΠ΅Π»ΠΊΠΎΠΌΡƒ) ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΡŽ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС "Π·Π°Π²Π΅Ρ€Π½ΠΈΡ‚Π΅" этот Ρ„Π°ΠΉΠ» Π² свой собствСнный, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ исходный ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #include ΠΈ ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ для Π½Π΅Π³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ прСдупрСТдСния. Π’ своСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнный Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π° Π½Π΅ исходный. НапримСр (ΡƒΡ‡Ρ‚ΠΈΡ‚Π΅ β€” ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Π²Π°Ρ€ΡŒΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‚ компилятора ΠΊ компилятору):

// Π€Π°ΠΉΠ»: myproj/my_lambda.h - "ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°" для lambda.hpp ΠΈΠ·

// Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Boost. ВсСгда Π²ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ этот Ρ„Π°ΠΉΠ» ΠΈ Π½Π΅

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ lambda.hpp нСпосрСдствСнно. Boost.Lambda

// ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ компилятором ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, ΠΎ

// бСзврСдности ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°ΠΌ Π΄ΠΎΠΏΠΎΠ΄Π»ΠΈΠ½Π½ΠΎ извСстно, ΠΊΠΎΠ³Π΄Π°

// Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΡΠ΄Π΅Π»Π°ΡŽΡ‚ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, которая Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚

// Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, ΠΌΡ‹ ΡƒΠ΄Π°Π»ΠΈΠΌ ΠΈΠ· этого Ρ„Π°ΠΉΠ»Π°

// ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #pragma, Π½ΠΎ сам Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ

// Ρ„Π°ΠΉΠ» останСтся.

//

#pragma warning(push) // ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ

// для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°

#pragma warning(disable:4512)

#pragma warning(disable:4180)

#include <boost/lambda/lambda.hpp>

#pragma warning(pop) // ВосстанавливаСм исходный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ

// Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. "ΠΠ΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ". Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π² самом Π΄Π΅Π»Π΅ ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (НапримСр, это "Π·Π°Π³Π»ΡƒΡˆΠΊΠ°" для Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ трСбуСмая стандартом Ρ‡Π°ΡΡ‚ΡŒ сигнатуры, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ваш ΠΊΠΎΠ΄ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚). Если этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π²Π°ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Π½ΡƒΠΆΠ΅Π½, просто ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ Π΅Π³ΠΎ имя:

// ... Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ распрСдСлитСля подсказка Π½Π΅

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ …


// ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: "Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ 'localityHint'"

pointer allocate(size_type numObjects,

 const void *localityHint = 0) {

 return static_cast<pointer>(

  mallocShared(numObjects * sizeof(T)));

}


// новая вСрсия: ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ устранСно

pointer allocate(size_type numObjects,

 const void* /* localityHint */ = 0) {

 return static_cast<pointer>(

  mallocShared(numObjects * sizeof(T)));

}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3. "ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Π½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ". Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (ΠΊ Ρ‚Π°ΠΊΠΈΠΌ прСдупрСТдСниям часто приводят Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠ΄ΠΈΠΎΠΌΠ΅ "Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ рСсурса Π΅ΡΡ‚ΡŒ инициализация", см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 13). Если ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ трСбуСтся, часто ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ компилятор Π·Π°ΠΌΠΎΠ»Ρ‡Π°Ρ‚ΡŒ, Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ² "вычислСниС" самой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² качСствС выраТСния (Ρ‚Π°ΠΊΠΎΠ΅ вычислСниС Π½Π΅ влияСт Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹):

// ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: "пСрСмСнная 'lock' ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Π½ΠΎ Π½Π΅

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ"

void Fun() {

 Lock lock;

 // ...

}


// новая вСрсия: ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ

void Fun() {

 Lock lock;

 lock;

 // ...

}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4. "ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‡ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ". Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 19).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 5. "ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ return". Иногда компиляторы Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ наличия инструкции return нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ управлСния Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΊΠΎΠ½Ρ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ бСсконСчного Ρ†ΠΈΠΊΠ»Π°, инструкции throw, Π΄Ρ€ΡƒΠ³ΠΈΡ… инструкций return). Π’Π°ΠΊΠΎΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅ стоит ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ достигаСт ΠΊΠΎΠ½Ρ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр, конструкция switch, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Ρ‚ Π²Ρ‹Π±ΠΎΡ€Π° default, ΠΏΡ€ΠΈ внСсСнии ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСприятностям, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ слСдуСт ΠΈΠΌΠ΅Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ default, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто выполняСт assert(false) (см. Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ 68 ΠΈ 90):

// ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ "return"

int Fun(Color C) {

 switch(C) {

 case Red: return 2;

 case Green: return 0;

 case Blue:

 case Black: return 1;

 }

}


// Новая вСрсия: ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ устранСно

int Fun(Color C) {

 switch(C) {

 case Red: return 2;

 case Green: return 0;

 case Blue:

 case Black: return 1;

 // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ !"string" Ρ€Π°Π²Π½ΠΎ false:

 default: assert(!"should never get here!");

 return -1;

 }

}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 6. "НСсоотвСтствиС signed/unsigned". ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ числа с Ρ€Π°Π·Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ знаковости. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏΡ‹ сравниваСмых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ соотвСтствовали Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ. Π’ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΌ случаС, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ явным ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ². (ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ всС Ρ€Π°Π²Π½ΠΎ вставляСт Π² ΠΊΠΎΠ΄ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ± этом, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.)