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

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

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

[Alexandrescu01] Β§3 β€’ [Boost] β€’ [Meyers97] Β§46 β€’ [Stroustrup00] Β§2.4.2 β€’ [Sutter02] Β§4 β€’ [Sutter04] Β§2, Β§19

15. Активно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ const

РСзюмС

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

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

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ ΠΊΠΎΠ΄, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π°ΠΌ достаточно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Π΅ΠΌΡƒ ΠΎΠ½Π° Ρ€Π°Π²Π½Π° Π²Π΅Π·Π΄Π΅. Рассмотрим Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:

void Fun(vector<int>& v) {

 // ...

 const size_t len = v.size();

 // ... ΠΈ Π΅Ρ‰Π΅ 30 строк ...

}

Π£Π²ΠΈΠ΄Π΅Π² Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ len, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ сСмантикС этой константы Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… области Π΅Π΅ видимости (Π² ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π½Π΅ устраняСт Π΅Π΅ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ, Ρ‡Π΅Π³ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ Π΄Π°Π»Π΅Π΅): это информация ΠΎ Π΄Π»ΠΈΠ½Π΅ v Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Взглянув Π½Π° ΠΎΠ΄Π½Ρƒ строку, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ всю Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для всСй области видимости. Если Π±Ρ‹ пСрСмСнная len Π½Π΅ Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ const, ΠΎΠ½Π° ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° β€” нСпосрСдствСнно ΠΈΠ»ΠΈ косвСнно.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ описаниС const Π½Π΅ являСтся Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ имССтся Π² Π²ΠΈΠ΄Ρƒ, рассмотрим класс Π‘, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π»Π΅Π½ Ρ‚ΠΈΠΏΠ° X*. Π’ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Π‘, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся константой, Ρ‡Π»Π΅Π½ X* Ρ‚Π°ΠΊΠΆΠ΅ являСтся константой, Π½ΠΎ сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ X, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, константой Π½Π΅ являСтся (см. [Saks99]).

Π›ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ слСдуСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ с использованиСм Ρ‡Π»Π΅Π½ΠΎΠ², описанных ΠΊΠ°ΠΊ mutable. Когда константная функция-Ρ‡Π»Π΅Π½ класса ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π° (Ρ‚.Π΅. ΠΊΠΎΠ³Π΄Π° эта пСрСмСнная Π½Π΅ влияСт Π½Π° наблюдаСмоС состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли это ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅), ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ ΠΊΠ°ΠΊ mutable. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ссли всС Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ скрыты с использованиСм ΠΈΠ΄ΠΈΠΎΠΌΡ‹ Pimpl (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 43), описаниС mutable Π½Π΅ являСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ Π½ΠΈ для ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π½ΠΈ для Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ указатСля Π½Π° Π½Π΅Π΅.

ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ const Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ вирусноС Π·Π°Π±ΠΎΠ»Π΅Π²Π°Π½ΠΈΠ΅ β€” появившись Π² вашСм ΠΊΠΎΠ΄Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΎΠ½ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ нСобходимости ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ измСнСния сигнатур Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ Π² ΠΏΠ»Π°Π½Π΅ использования const. Π­Ρ‚ΠΎ ΠΊΠ°ΠΊ Ρ€Π°Π· Π½Π΅ ошибка, Π° Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ свойство, сущСствСнно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ ΠΌΠΎΡ‰ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° const, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Π΅ Π½Π΅ Ρ‚Π°ΠΊ Π΄Π°Π²Π½ΠΎ Π±Ρ‹Π» достаточно Π·Π°Π±Ρ€ΠΎΡˆΠ΅Π½, Π° Π΅Π³ΠΎ возмоТности Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ поняты ΠΈ ΠΎΡ†Π΅Π½Π΅Π½Ρ‹. ΠŸΠ΅Ρ€Π΅Π΄Π΅Π»ΠΊΠ° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° для Π΅Π³ΠΎ коррСктности Π² ΠΏΠ»Π°Π½Π΅ использования const Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ усилий, Π½ΠΎ ΠΎΠ½ΠΈ стоят Ρ‚ΠΎΠ³ΠΎ ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ скрытыС ошибки.

ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ const Π΄Π°Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ. Π§Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ const Π² Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. ПониманиС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈ Π³Π΄Π΅ измСняСтся состояниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, особСнно Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ const ΠΏΠΎ сути Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ нСпосрСдствСнно Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ Π² этом. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ const ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с вопросами проСктирования ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ваш ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ ΠΈ бСзопасным. Если Π²Ρ‹ выяснили, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ константной, Π·Π½Π°Ρ‡ΠΈΡ‚, Π²Ρ‹ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ, Π³Π΄Π΅ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ эта функция ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ смоТСтС ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹-Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ Ρ„ΠΈΠ·ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈ Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ (см. ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹).

Никогда Π½Π΅ ΠΏΡ€ΠΈΠ±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡŽ константного Ρ‚ΠΈΠΏΠ° Π² нСконстантный, ΠΊΡ€ΠΎΠΌΠ΅ случаСв Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Π² ΠΏΠ»Π°Π½Π΅ использования ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° const (Π½Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ описан ΠΊΠ°ΠΊ нСконстантный), Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π΅Π΄ΠΊΠΎΠ³ΠΎ случая, ΠΊΠ°ΠΊ способ Π·Π°ΠΌΠ΅Π½Ρ‹ mutable Π² старом компиляторС, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΌ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ.

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ const Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Π”Π²Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… объявлСния Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ эквивалСнтны:

void Fun(int x);


void Fun(const int x); // ОбъявлСниС Ρ‚ΠΎΠΉ ΠΆΠ΅ самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

                       // const здСсь игнорируСтся

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ объявлСнии ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ const ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π΅Π½. ΠœΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· Ρ‚Π°ΠΊΠΈΡ… высокоуровнСвых ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² const, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‚, ΠΊΡ‚ΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ваши Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Π½Π΅ Π±Ρ‹Π» Π΄Π΅Π·ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½. Однако использованиС Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π°Π²Π΄Π°Π½ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния обнаруТСния Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ измСнСния ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

void Fun(const int x) { // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Fun

 // ...

 ++x; // Ошибка: нСльзя ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ константноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

 // ...

}

Бсылки

[Allison98] Β§10 β€’ [Cline99] Β§14.02-12 β€’ [Dewhurst03] Β§6, Β§31-32, Β§82 β€’ [Keffer95] pp. 5-6 β€’ [Koenig97] Β§4 β€’ [Lakos96] Β§9.1.6, Β§9.1.12 β€’ [Meyers97] Β§21 β€’ [Murray93] Β§2.7 β€’ [Stroustrup00] Β§7.2, Β§10.2.6, Β§16.3.1 β€’ [Sutter00] Β§43

16. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ макросов

РСзюмС

ΠœΠ°ΠΊΡ€ΠΎΡ β€” самый нСприятный инструмСнт Π‘ ΠΈ Π‘++, ΠΎΠ±ΠΎΡ€ΠΎΡ‚Π΅Π½ΡŒ, ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΏΠΎΠ΄ Π»ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚, Π³ΡƒΠ»ΡΡŽΡ‰ΠΈΠΉ сам ΠΏΠΎ сСбС ΠΈ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ внимания Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π²Π°ΡˆΠΈΡ… областСй видимости. Π‘Π΅Ρ€Π΅Π³ΠΈΡ‚Π΅ΡΡŒ Π΅Π³ΠΎ!

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

Π’Ρ€ΡƒΠ΄Π½ΠΎ Π½Π°ΠΉΡ‚ΠΈ язык, достаточно красочный, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ хочСтся ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ макросах. Но Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ нСсколько Ρ†ΠΈΡ‚Π°Ρ‚.

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

β€” [Sutter04] Β§31

МнС Π½Π΅ нравится Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²ΠΈΠ΄ΠΎΠ² прСпроцСссоров ΠΈ макросов. Одна ΠΈΠ· Ρ†Π΅Π»Π΅ΠΉ Π‘++ β€” ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ прСпроцСссор Π‘ излишним (Β§4.4, Β§18), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я ΡΡ‡ΠΈΡ‚Π°ΡŽ Π΅Π³ΠΎ большой ошибкой

β€” [Stroustrup94] Β§3.3.1.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Π² Π‘++. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ const (Β§5.4) ΠΈΠ»ΠΈ enum (Β§4.8) для опрСдСлСния явных констант [см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 15], inline (Β§7.1.1) для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ [Π½ΠΎ см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 8], template (Π³Π»Π°Π²Π° 13) для опрСдСлСния сСмСйств Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ‚ΠΈΠΏΠΎΠ² [см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ с 64 ΠΏΠΎ 67], ΠΈ namespace (Β§8.2) для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΈΠΌΠ΅Π½ [см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ с 57 ΠΏΠΎ 59].

β€” [Stroustrup00] Β§1.6.1

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΏΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ макросов гласит: Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΡ… Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Ρƒ вас Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π°. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ любой макрос ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Π½Π΅ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²Π΅ языка программирования, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ»ΠΈ программиста.

β€” [Stroustrup00] Β§7.8

Основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с макросами Π‘++ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ выглядят Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Π΅Π΅, Ρ‡Π΅ΠΌ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ Π½Π° самом Π΄Π΅Π»Π΅. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ области видимости, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ возмоТности ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° языка, ΠΈ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ всС символы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #define, Π΄ΠΎ самого ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ макросов внСшнС ΠΏΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° имя ΠΈΠ»ΠΈ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ с Π½ΠΈΠΌΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ "Π½Π΅Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡ‡Π½Ρ‹", Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ раскрыты Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ контСкста ΠΈΡ… использования Π² самыС Ρ€Π°Π·Π½Ρ‹Π΅ конструкции. ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° тСкста, выполняСмая макросами, Π΄Π΅Π»Π°Π΅Ρ‚ написаниС хотя Π±Ρ‹ Π² нСбольшой стСпСни "ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎΠ³ΠΎ" макроса смСсью искусства ΠΈ Ρ‡Π΅Ρ€Π½ΠΎΠΉ ΠΌΠ°Π³ΠΈΠΈ.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ тяТСлСС всСго Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки, связанныС с шаблонами, вСроятно, просто Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΠΌΠ΅Π»ΠΈ Π΄Π΅Π»Π° с ΠΏΠ»ΠΎΡ…ΠΎ написанными ΠΈΠ»ΠΈ Π½Π΅Π²Π΅Ρ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ макросами. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ систСмы Ρ‚ΠΈΠΏΠΎΠ² Π‘++, ΠΈ Ρ‚Π΅ΠΌ самым ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ компилятору ΠΊΡƒΠ΄Π° Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ с Π½ΠΈΠΌΠΈ, Ρ‡Π΅ΠΌ с макросами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΌΠ°Π»ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ с языком программирования. Π₯ΡƒΠΆΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ шаблонов Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ макросы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ раскрыты Π² Π½Π΅Ρ‡Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² силу чистой случайности скомпилируСтся, Π½Π΅ имСя ΠΏΡ€ΠΈ этом Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ смысла. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ошибка Π² макросС обнаруТиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ макрос раскрываСтся, Π° Π½Π΅ ΠΏΡ€ΠΈ Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ.

Π”Π°ΠΆΠ΅ Π² Ρ‚Π΅Ρ… Ρ€Π΅Π΄ΠΊΠΈΡ… случаях, Π³Π΄Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ макросов ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎ (см. ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π», посвящСнный ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌ), нСльзя Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся распространСнным словом ΠΈΠ»ΠΈ Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ. Для всСх макросов ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС примСняйтС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #undef, всСгда давая ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС, избСгая ΠΏΡ€ΠΈ этом размСщСния ΠΈΡ… Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ….