Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

8.2 Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π’ΠΈΠΏΠ°

8.2 Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π’ΠΈΠΏΠ°

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠΎΠ² (спСцификатор_Ρ‚ΠΈΠΏΠ°) ΡΠ²Π»ΡΡŽΡ‚ΡΡ:

простоС_имя_Ρ‚ΠΈΠΏΠ° спСцификатор_класса enum-спСцификатор слоТный_спСцификатор_Ρ‚ΠΈΠΏΠ° const

Π‘Π»ΠΎΠ²ΠΎ const ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ допустимому спСцфикатору_Ρ‚ΠΈΠΏΠ°. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях Π² описании ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π°Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ спСцификатора_Ρ‚ΠΈΠΏΠ°. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° const Π½Π΅ яляСтся lvalue. Если Π² описании ΠΎΠΏΡƒΡ‰Π΅Π½ спСцификатор Ρ‚ΠΈΠΏΠ°, ΠΎΠ½ принимаСтся int.

простоС_имя_Ρ‚ΠΈΠΏΠ°: char short int long unsigned float double const void

Π‘Π»ΠΎΠ²Π° long, short ΠΈ unsigned ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ Ρ‚ΠΈΠΏΡƒ int; unsigned ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ char, short ΠΈ long.

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ класса ΠΈ пСрСчислСния ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² #8.5 ΠΈ #8.10 соотвСтствСнно.

слоТный_спСцификатор_Ρ‚ΠΈΠΏΠ°: ΠΊΠ»ΡŽΡ‡ typedef-имя ΠΊΠ»ΡŽΡ‡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

ΠΊΠ»ΡŽΡ‡: class struct union enum

Π‘Π»ΠΎΠΆΠ½Ρ‹ΠΉ спСцификатор Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ссылки Π½Π° имя класса ΠΈΠ»ΠΈ пСрСчислСния Ρ‚Π°ΠΌ, Π³Π΄Π΅ имя ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ скрыто Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. НапримСр:

Если имя класса ΠΈΠ»ΠΈ пСрСчислСния Ρ€Π°Π½Π΅Π΅ описано Π½Π΅ Π±Ρ‹Π»ΠΎ, слоТный_спСцификатор_Ρ‚ΠΈΠΏΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ описаниС_ΠΈΠΌΠ΅Π½ΠΈ, см. #8.8.

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

12.5.1 Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρ‹ Ρ‚ΠΈΠΏΠ° vi

12.5.1 Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρ‹ Ρ‚ΠΈΠΏΠ° vi Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ vi (ΠΈΠ»ΠΈ Π΅Π³ΠΎ нСсколько Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ) ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π»ΡŽΠ±ΡƒΡŽ UNIX-ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ систСму, Π² Ρ‚ΠΎΠΌ числС ΠΈ Π²ΠΎ всС дистрибутивы Linux. ВсС ΠΏΡ€ΠΈΠ²Π΅Ρ€ΠΆΠ΅Π½Ρ†Ρ‹ UNIX, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ стаТ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с этими ОБ, Π·Π½Π°ΡŽΡ‚ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ этот Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€. ОписаниС

R.7.1.6 БпСцификация Ρ‚ΠΈΠΏΠ°

R.7.1.6 БпСцификация Ρ‚ΠΈΠΏΠ° К спСцификации Ρ‚ΠΈΠΏΠ° относятся:спСцификация-Ρ‚ΠΈΠΏΠ°: имя-простого-Ρ‚ΠΈΠΏΠ° спСцификация-класса спСцификация-пСрСчислСния спСцификация-слоТного-Ρ‚ΠΈΠΏΠ° :: имя-класса const volatileΠŸΡ€ΠΈ описании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° слуТСбныС слова const ΠΈ volatile ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ любой Π·Π°ΠΊΠΎΠ½Π½ΠΎΠΉ

R.14 Π¨ΠΠ‘Π›ΠžΠΠ« ВИПА

R.14.1 Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Ρ‚ΠΈΠΏΠ°

R.14.4 Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Ρ‚ΠΈΠΏΠ° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

R.14.4 Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Ρ‚ΠΈΠΏΠ° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π¨Π°Π±Π»ΠΎΠ½ Ρ‚ΠΈΠΏΠ° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ опрСдСляСт ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒΡΡ функция. НапримСр, сСмСйство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ sort ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:templateβ€Ήclass Tβ€Ί void sort(vectorβ€ΉTβ€Ί);Π¨Π°Π±Π»ΠΎΠ½ Ρ‚ΠΈΠΏΠ° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ мноТСство ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

R.17.8 Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Ρ‚ΠΈΠΏΠ°

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Ρ‚ΠΈΠΏΠ° Sub

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Ρ‚ΠΈΠΏΠ° Sub Π’Π΅Ρ€ΠΌΠΈΠ½ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Ρ‚ΠΈΠΏΠ° Sub каТСтся ΠΌΠ½Π΅ довольно Π½Π΅ΡƒΠΊΠ»ΡŽΠΆΠΈΠΌ, Π½ΠΎ ΠΎΠ½ достаточно Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΡΡƒΡ‚ΡŒ Π΄Π΅Π»Π°. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках программирования суб ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌ ΠΈ, ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π³Π»Π°Π²Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ. Π’ VBA, хотя ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Ρ‚ΠΈΠΏΠ°

Π’Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Ρ‚ΠΈΠΏΠ° Sub

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Ρ‚ΠΈΠΏΠ° Function

ΠžΡ‚Π»ΠΈΡ‡ΠΈΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Ρ‚ΠΈΠΏΠ° Function ΠΎΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Ρ‚ΠΈΠΏΠ° Sub

ΠžΡ‚Π»ΠΈΡ‡ΠΈΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Ρ‚ΠΈΠΏΠ° Function ΠΎΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Ρ‚ΠΈΠΏΠ° Sub ΠœΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° Function ΠΈ Ρ‚ΠΈΠΏΠ° Sub Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ сущСствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅: Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Ρ‚ΠΈΠΏΠ° Function ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π³Π΄Π΅-Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя

ВСстированиС Ρ‚ΠΈΠΏΠ° CarControl

ВСстированиС Ρ‚ΠΈΠΏΠ° CarControl ΠŸΡ€ΠΈ запускС ΠΈΠ»ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Windows Control Library Π² Visual Studio 2005 ΠΈcΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ UserControl Test Container (ΠΈΡΠΏΡ‹Ρ‚Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… элСмСнтов управлСния). Π­Ρ‚ΠΎ управляСмый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠΆΠ΅ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅Π³ΠΎ ActiveX Control Test Container (ΠΈΡΠΏΡ‹Ρ‚Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€

ОбъявлСниС Ρ‚ΠΈΠΏΠ°

ОбъявлСниС Ρ‚ΠΈΠΏΠ° БущСствуСт Π΄Π²Π° особых Π²ΠΈΠ΄Π° объявлСния, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π½Π΅ пСрСмСнная ΠΈΠ»ΠΈ функция, Π° Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²ΠΈΠ΄ позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Π΅Π³ ΠΈ элСмСнты структуры, объСдинСния ΠΈΠ»ΠΈ пСрСчислимого Ρ‚ΠΈΠΏΠ°. ПослС Ρ‚Π°ΠΊΠΎΠ³ΠΎ объявлСния имя Ρ‚ΠΈΠΏΠ° (Ρ‚Π΅Π³) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ

Π’Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° Β«ΠΎΠ΄Π΅ΠΆΠΊΠΈΒ»

Π’Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° Β«ΠΎΠ΄Π΅ΠΆΠΊΠΈΒ» ВсС ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ Π²ΠΈΠ΄ΠΎΠ² кСйсов для Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ свСсти ΠΊ Ρ‚Ρ€Π΅ΠΌ позициям:Π‘ΡƒΠΌΠΊΠ°. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΌΠΈ портфСлями-сумками Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ 90 % Ρ€Ρ‹Π½ΠΊΠ°. ΠœΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄ ТСнской сумочки, портфСля, ΠΊΠΎΡ„Ρ€Π°, саквояТа, Π΄ΠΈΠΏΠ»ΠΎΠΌΠ°Ρ‚Π°, Ρ‡Π΅ΠΌΠΎΠ΄Π°Π½Π°. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ элСмСнты

3.2.5 ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°

3.2.5 ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π‘Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΏΠ° Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Π―Π²Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π΄Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° для Π΄Π°Π½Π½ΠΎΠ³ΠΎ значСния Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. НапримСр:float r = float(1);ΠΏΠ΅Ρ€Π΅Π΄ присваиваниСм ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 ΠΊ Π·Π½Ρ‡Π΅Π½ΠΈΡŽ с

7.2.7 Поля Випа

7.2.7 Поля Π’ΠΈΠΏΠ° Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ классы Π½Π΅ просто ΠΊΠ°ΠΊ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ ΡΠΎΠΊΡ€Π°Ρ‰Π΅Π½Π½ΡƒΡŽ запись Π² описаниях, Π½Π°Π΄ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ: Если Π·Π°Π΄Π°Π½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° base*, ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΏΡ€ΠΎΠΈΠ²ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±Π΅ΠΊΡ‚? Π•ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ основных

8.1 Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Класса ΠŸΠ°ΠΌΡΡ‚ΠΈ

8.1 Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Класса ΠŸΠ°ΠΌΡΡ‚ΠΈ Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ – это:спСцификатор_класса_памяти: auto static extern registerОписания, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ спСцификаторы auto, static ΠΈ register Ρ‚Π°ΠΊΠΆΠ΅ слуТат опрСдСлСниями Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ€Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ объСма памяти. Если описаниС extern Π½Π΅

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄

Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄

БСгодня ΠΌΡ‹ рассмотрим Π΄Π²Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°. Устройство ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС изучСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с указатСлями ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Но ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этими функциями Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΆΠ΅ сСйчас, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ придётся ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.

Ѐункция ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ строкС ΠΈ замСняСт ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ % Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ % Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈ Ρ‚.Π΄. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ просто Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ список Ρ„Π»Π°Π³ΠΎΠ² ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования.

ΠžΠ±Ρ‰ΠΈΠΉ синтаксис спСцификатора Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°
%[Ρ„Π»Π°Π³ΠΈ][ΡˆΠΈΡ€ΠΈΠ½Π°][.Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ][Π΄Π»ΠΈΠ½Π°]спСцификатор
Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ – это самый Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. Он опрСдСляСт Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ способ Π΅Ρ‘ Π²Ρ‹Π²ΠΎΠ΄Π°.

Π’Π°Π±. 1 Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ°.

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π§Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹Π²Π΅ΡΡ‚ΠΈΠŸΡ€ΠΈΠΌΠ΅Ρ€
d ΠΈΠ»ΠΈ iΠ¦Π΅Π»ΠΎΠ΅ со Π·Π½Π°ΠΊΠΎΠΌ Π² Π² дСсятичном Π²ΠΈΠ΄Π΅392
uΠ¦Π΅Π»ΠΎΠ΅ Π±Π΅Π· Π·Π½Π°ΠΊΠ° Π² дСсятичном Π²ΠΈΠ΄Π΅7235
oΠ‘Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π² Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅657
xΠ‘Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅7fa
XΠ‘Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр7FA
f ΠΈΠ»ΠΈ FЧисло с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ3.4563745
eΠ­ΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° для числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ3.1234e+3
EΠ­ΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° для числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр3.1234E+3
gΠšΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅Π΅ ΠΈΠ· прСдставлСний Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² f ΠΈ e3.12
GΠšΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅Π΅ ΠΈΠ· прСдставлСний Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² F ΠΈ E3.12
aШСстнадцатСричноС прСдставлСниС числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ-0xc.90fep-2
AШСстнадцатСричноС прСдставлСниС числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр-0xc.90FEP-2
cΠ‘ΡƒΠΊΠ²Π°a
sΠ‘Ρ‚Ρ€ΠΎΠΊΠ° (Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ массив Π±ΡƒΠΊΠ²)Hello World
pАдрСс указатСляb8000000
nНичСго Π½Π΅ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚. АргумСнтом Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° signed int. По этому адрСсу Π±ΡƒΠ΄Π΅Ρ‚ сохранСно количСство Π±ΡƒΠΊΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ Π΄ΠΎ встрСчи %n
%Π”Π²Π° ΠΈΠ΄ΡƒΡ‰ΠΈΡ… Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π° выводят Π·Π½Π°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°%

Π‘ΡƒΠ±-спСцификатор Π΄Π»ΠΈΠ½Ρ‹ измСняСт Π΄Π»ΠΈΠ½Ρƒ Ρ‚ΠΈΠΏΠ°. Π’ случаС, Ссли Π΄Π»ΠΈΠ½Π° Π½Π΅ совпадаСт с Ρ‚ΠΈΠΏΠΎΠΌ, ΠΏΠΎ возмоТности происходит ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Π’Π°Π±. 5 Π”Π»ΠΈΠ½Π°.

спСцификаторы
Π”Π»ΠΈΠ½Π°d, iu o x Xf F e E g G a Acspn
(none)intunsigned intdoubleintchar*void*int*
hhsigned charunsigned charsigned char*
hshort intunsigned short intshort int*
llong intunsigned long intwint_twchar_t*long int*
lllong long intunsigned long long intlong long int*
jintmax_tuintmax_tintmax_t*
zsize_tsize_tsize_t*
tptrdiff_tptrdiff_tptrdiff_t*
Llong double

Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄

Как ΠΈ Π² printf, ΡˆΠΈΡ€ΠΈΠ½Π°, заданная символом * ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΡˆΠΈΡ€ΠΈΠ½Ρƒ. Π€Π»Π°Π³ Π΄Π»ΠΈΠ½Π° совпадаСт с Ρ‚Π°ΠΊΠΈΠΌ Ρ„Π»Π°Π³ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf.

ΠšΡ€ΠΎΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ scanf ΠΈ printf Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

Π­Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ символьного Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°. Π’Π°ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΡ€Π΅, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… нСбСзопасны, поэтому ΠΏΠ΅Ρ€Π΅Π΄ использованиСм Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ.

НСпСчатныС символы

Π’ си ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ ряд символов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ выводятся Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π°. Π­Ρ‚ΠΈ символы ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ числСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π»ΠΈΠ±ΠΎ Π² Π²ΠΈΠ΄Π΅ эскСйп-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ: символа, экранированного ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ слСшСм.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Ρ‚ΠΈΠΏΠΎΠ²

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

Π―Π·Ρ‹ΠΊ Π‘ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ опрСдСлСния для мноТСства Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΒ­ΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… «ΠΎΡΠ½ΠΎΠ²Π½Ρ‹ΠΌΠΈ» Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Названия этих Ρ‚ΠΈΠΏΠΎΠ² пСрСчислСны Π² Π’Π°Π±Π». 4.1.

Π’ΠΈΠΏΡ‹ Ρ†Π΅Π»Ρ‹Ρ… Π’ΠΈΠΏΡ‹ ΠΏΠ»Π°Π²Π°ΡŽΡ‰ΠΈΡ… Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹

signed char float void

signed short intsigned long int

unsignet short int unsigned long int

Π’Π°Π±Π». 4.1. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ основныС Ρ‚ΠΈΠΏΡ‹. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ пСрСчислимых Ρ‚ΠΈΠΏΠΎΠ² рассмотрСны Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.7.1. Π’ΠΈΒ­ΠΏΡ‹ signed char, signed int, signed short int ΠΈ signed long int

вмСстС с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π΄Π²ΠΎΠΉΠ½ΠΈΠΊΠ°ΠΌΠΈ unsigned Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Ρ†Π΅Π»Ρ‹Ρ….

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² float ΠΈ double относятся ΠΊ Ρ‚ΠΈΠΏΡƒ «ΠΏΠ»Π°Π²Π°Β­ΡŽΡ‰ΠΈΡ…». Π’ ΠΎΠ±»ΡΠ²Π»Π΅Π½ΠΈΡΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ спСцификаторы «Ρ†Π΅Π»Ρ‹ΠΉ» ΠΈ «ΠΏΠ»Π°Π²Π°ΡŽΡ‰ΠΈΠΉ».

Π’ΠΈΠΏ void ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ±»ΡΠ²Π»Π΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΒ­Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ значСния. Π’ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ рассмотрСны Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.4.

МоТно Π·Π°Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ спСцификаторы Ρ‚ΠΈΠΏΠ° ΠΏΡƒΡ‚Π΅ΠΌ ΠΎΠ±»ΡΠ²Β­Π»Π΅Π½ΠΈΡ typedef, описанного Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.7.2.

ΠŸΡ€ΠΈ записи спСцификаторов Ρ‚ΠΈΠΏΠΎΠ² допустимы сокращСния ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ‚Π°Π±Π». 4.2. Π’ Ρ†Π΅Π»Ρ‹Ρ… Ρ‚ΠΈΠΏΠ°Ρ… ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово signed ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ. Π’Π°ΠΊ, Ссли ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово unsigned опускаСтся Π² за­писи спСцификатора Ρ‚ΠΈΠΏΠ°, Ρ‚ΠΎ Ρ‚ΠΈΠΏ Ρ†Π΅Π»ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΌ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово signed.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… рСализациях ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΎΠΏΡ†ΠΈΠΈ ком­пилятора, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΠ΅ для Ρ‚ΠΈΠΏΠ° char со Π·Π½Π°ΠΊΠΎΒ­Π²ΠΎΠ³ΠΎ Π½Π° Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ. Когда Π·Π°Π΄Π°Π½Π° такая опция, сокращСниС char ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ unsigned char, ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово sidned Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ записано ΠΏΡ€ΠΈ ΠΎΠ±»ΡΠ²Π»Π΅Π½ΠΈΠΈ сим­вольной Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ со Π·Π½Π°ΠΊΠΎΠΌ.

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ° Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅

signed int signed, int

signed short int short, signed short

signed long int long, signed long

unsigned int unsigned

unsigned short int unsignet short

unsignet long int unsignet long

Π’Π°Π±Π». 4.2. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈ сокращСния

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π² этом руководствС Π² основном ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ сок­ращСнныС Ρ„ΠΎΡ€ΠΌΡ‹, пСрСчислСнныС Π² Π’Π°Π±Π». 4.2, ΠΏΡ€ΠΈ этом прСдполагаСт­ся, Ρ‡Ρ‚ΠΎ char ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ.

Π’ Ρ‚Π°Π±Π». 4.3 для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹: Ρ€Π°Π·ΠΌΠ΅Ρ€ распрСдСляС­мой памяти ΠΈ области Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. ΠŸΠΎΡΒ­ΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΈΠΏ void Π½Π΅ прСдставляСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΎΠ½ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.

Π’ΠΈΠΏ ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠžΠ±Π»Π°ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

unsigned char 1 Π±Π°ΠΉΡ‚ 0 Π΄ΠΎ 255

unsigned зависит ΠΎΡ‚

unsigned short 2 Π±Π°ΠΉΡ‚Π° 0 Π΄ΠΎ 65535

unsigned long 4 Π±Π°ΠΉΡ‚Π° 0 Π΄ΠΎ 4.294.967.295

float 4 Π±Π°ΠΉΡ‚Π° IEEE стандартноС

double 8 Π±Π°ΠΉΡ‚ IEEE стандартноС

Π’Π°Π±Π» 4.3 Π Π°Π·ΠΌΠ΅Ρ€ памяти ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ²

ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ эквивалСнты. Аналогично, Ρ‚ΠΈΠΏ unsigned char ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ 0 Π΄ΠΎ 255.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ прСдставлСниС Π² памяти ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для Ρ‚ΠΈΠΏΠΎΠ² int ΠΈ unsigned int Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² языкС Π‘ΠΈ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€ int (со Π·Π½Π°ΠΊΠΎΠΌ ΠΈ Π±Π΅Π· Π·Π½Π°ΠΊΠ°) соотвСтствуСт Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Β­Ρ€Ρƒ Ρ†Π΅Π»ΠΎΠ³ΠΎ Π½Π° Π΄Π°Π½Π½ΠΎΠΉ машинС. НапримСр, Π½Π° 16-Ρ‚ΠΈ разрядной машинС Ρ‚ΠΈΠΏ int всСгда 16 разрядов ΠΈΠ»ΠΈ 2 Π±Π°ΠΉΡ‚Π°. На 32-ΡƒΡ… разрядной машинС Ρ‚ΠΈΠΏ int всСгда 32 разряда ΠΈΠ»ΠΈ 4 Π±Π°ΠΉΡ‚Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΈΠΏ int эк­вивалСнтСн Ρ‚ΠΈΠΏΠ°ΠΌ short int ΠΈΠ»ΠΈ long int Π² зависимости ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Β­Ρ†ΠΈΠΈ.

Аналогично, Ρ‚ΠΈΠΏ unsigned int эквивалСнтСн Ρ‚ΠΈΠΏΠ°ΠΌ unsigned short ΠΈΠ»ΠΈ unsigned long. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² int ΠΈ unsigned int ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π° Π‘ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивно ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΌΠΈ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°ΠΌΠΈ Π½Π° Π΄Π°Π½Π½ΠΎΠΉ машинС.

Однако, Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚ΠΈΠΏΠΎΠ² int ΠΈ unsigned int ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ, поэтому ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, зависящиС ΠΎΡ‚ спСцифики Ρ€Π°Π·ΠΌΠ΅Ρ€Π° int ΠΈ unsigned int ΠΌΠΎΒ­Π³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ нСпСрСносимы. ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с sizeof ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹

Π’Π°ΠΊΠΎΠ΅ количСство ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов Π²Π²Π΅Π΄Π΅Ρ‚ Π² ступор любого Π½Π΅ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Но Π½Π° C++ Russia 2019 Piter ΠœΠΈΡ…Π°ΠΈΠ» ΠœΠ°Ρ‚Ρ€ΠΎΡΠΎΠ² (mmatrosov) Ρ€Π°Π·Π»ΠΎΠΆΠΈΠ» ΠΏΠΎ ΠΏΠΎΠ»ΠΎΡ‡ΠΊΠ°ΠΌ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈ спСцификаторы ΠΏΡ€ΠΈ объявлСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠœΡ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ для вас Ρ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π΄ΠΎΠΊΠ»Π°Π΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠΈ ΠœΠΈΡ…Π°ΠΈΠ»Π°.

Из Π΄ΠΎΠΊΠ»Π°Π΄Π° Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅:

Π”Π°Π»Π΅Π΅ β€” повСствованиС ΠΎΡ‚ Π»ΠΈΡ†Π° спикСра.

НСмного Ρ‚Π΅ΠΎΡ€ΠΈΠΈ

ΠŸΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ нСбольшой тСорСтичСский экскурс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ дальнСйший ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π΄ΠΎΠΊΠ»Π°Π΄Π°.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ происходит сборка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° C++:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

Π’ исходныС cpp-Ρ„Π°ΠΉΠ»Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ hpp-Ρ„Π°ΠΉΠ»Ρ‹. Π’ΠΎ врСмя сборки ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ прСпроцСссор. Из исходных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΠ½ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ трансляции (translation units), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ собраны всС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ (headers), Π° Π·Π° Π½ΠΈΠΌΠΈ ΠΈΠ΄Π΅Ρ‚ Ρ‚Π΅Π»ΠΎ cpp-Ρ„Π°ΠΉΠ»Π°. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, компилятор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ сохраняСт ΠΈΡ… Π² явном Π²ΠΈΠ΄Π΅ Π½Π° ТСстком дискС, Π° ΠΎΠ½ΠΈ Π»Π΅ΠΆΠ°Ρ‚ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти.

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

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

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ linkage. Рассмотрим ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π’ Ρ„Π°ΠΉΠ»Π΅ a.cpp содСрТится функция sqr():

А Π² Ρ„Π°ΠΉΠ»Π΅ b.cpp находится Π΅Π΅ объявлСниС ΠΈ нСкоторая функция check():

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° скомпилируСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² a.cpp ΠΈΠΌΠ΅Π΅Ρ‚ external linkage. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΊΠΎΠ³Π΄Π° компилятор создаст ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Π² a.obj ΠΎΠ½ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sqr(), Π° Π² b.obj β€” объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΎΠΉ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ Ρ„Π°ΠΉΠ»Π΅ Π»Π΅ΠΆΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sqr(), ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π΅Π³ΠΎ Π½Π°ΠΉΠ΄Π΅Ρ‚. Если ΠΆΠ΅ Π² объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово static, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ собСрСтся ΠΈΠ·-Π·Π° ошибки Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ. Π’Π°ΠΊ ΠΊΠ°ΠΊ функция sqr() Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ internal linkage, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ нСдоступна Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… трансляции, ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π΅Ρ‘ Π½Π΅ Π½Π°ΠΉΠ΄Ρ‘Ρ‚.

ΠšΡ€ΠΎΠΌΠ΅ external linkage ΠΈ internal linkage ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ статус no linkage. Π’Π°ΠΊΠ° ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ доступна Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ объявлСна. Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” локальная пСрСмСнная.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ вспомним Ρ‚ΠΈΠΏΡ‹ storage duration Π² C++:

Storage duration ΠΈ linkage ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ рядом ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов (storage class specifiers) β€” static, extern, thread_local ΠΈ mutable. Mutable Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ Storage duration ΠΈ linkage, ΠΈ ΠΎΠ± этом Π² Π΄ΠΎΠΊΠ»Π°Π΄Π΅ большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Π½ΠΎ ΠΎΠ½ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ являСтся storage class specifier.

На тСорСтичСском экскурсС ΠΌΡ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ»ΠΈ Π½Π° Ρ‚Ρ€ΠΈ вопроса:

Internal ΠΈ external linkage

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ common.hpp объявили Π΄Π²Π΅ константы:

А Π² исходныС Ρ„Π°ΠΉΠ»Ρ‹ a.cpp ΠΈ b.cpp Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ этот hpp-Ρ„Π°ΠΉΠ»:

Π­Ρ‚ΠΎ Π½Π΅ скомпилируСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ нСсколько ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΈΠΌΠ΅Π½ΠΈ name. Однако компилятор Π½Π΅ ругаСтся Π½Π° thickness. ΠŸΠΎΡ‡Π΅ΠΌΡƒ?

Any of the following names declared at namespace scope have internal linkage:

МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ const-qualified, поэтому ΠΈΠΌΠ΅ΡŽΡ‚ internal linkage, ΠΈ ΠΈΡ… опрСдСлСния Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… трансляции Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ нСзависимы. Однако name β€” это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово const относится ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° константу, Π½ΠΎ Π½Π΅ являСтся константным ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ константным, Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ запись:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ name стал константным ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° константу, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» internal linkage, ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° собираСтся Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π­Ρ‚ΠΎ скомпилируСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ name β€” константный символ, Π° спСцификатор constexpr для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²Π»Π΅Ρ‡Π΅Ρ‚ Π·Π° собой const, плюс linkage constexpr сущностСй Π² явном Π²ΠΈΠ΄Π΅ описан Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Π°Π±Π·Π°Ρ†Π΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ±Π΅ константы ΠΈΠΌΠ΅ΡŽΡ‚ internal linkage.

Any of the following names declared at namespace scope have internal linkage:

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ. Π’ common.hpp оставим name ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getName(), которая доступна ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ† трансляции:

Π’ a.cpp ΠΌΡ‹ сравниваСм адрСса Π±ΡƒΡ„Π΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ name.data() ΠΈ getName():

Π’ b.cpp ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getName():

ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ name доступна Π² ΠΎΠ±Π΅ΠΈΡ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… трансляции. Но одинаковая Π»ΠΈ пСрСмСнная Π² ΠΎΠ±ΠΎΠΈΡ… случаях? НСт, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ false, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ трансляции создаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ копия name, Π° сравнСниС Π² dumbCmp() ΠΈΠ΄Π΅Ρ‚ Π½Π΅ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π° ΠΏΠΎ адрСсу Π² памяти.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π΄Π°Π»Π° true, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ name спСцификатор inline:

Π’ этом случаС Π²ΠΎ всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ name, ΠΈ эта пСрСмСнная ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ особСнный external linkage. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ трансляции всС Π΅Ρ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ своя копия ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π° этапС компиляции, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° этот символ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΡƒ, Ρ‡Ρ‚ΠΎ это weak символ. И ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΡ€ΠΈ объСдинСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… символов Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½. Π’ стандартС Π½Π΅Ρ‚ понятия external weak linkage, поэтому Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ external linkage. Однако Ссли ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° nm ΠΈΠ»ΠΈ dumpbin ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π²Ρ‹Π²Π΅Π΄ΡƒΡ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ external weak linkage.

Π­Ρ‚ΠΎ Π½Π΅ скомпилируСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ трансляции Π±ΡƒΠ΄Π΅Ρ‚ своС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»Π°ΡΡŒ, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ спСцификатор constexpr:

Если функция constexpr-qualified, Ρ‚ΠΎ ΠΎΠ½Π° считаСтся inline. А спСцификатор inline для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Π²Π»Π΅Ρ‡Π΅Ρ‚ external weak linkage. Π’ соврСмСнном C++ inline Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр Π΄Π°Π½Π½ΠΎΠΉ сущности.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ пишСм ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ main.cpp, Π³Π΄Π΅ создаСм класс Local ΠΈ объявляСм Π² Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ foo():

Но Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π² other.cpp Ρ‚ΠΎΠΆΠ΅ нСзависимо Π·Π°Π²Π΅Π» класс Local ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ foo():

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΅ΡΡ‚ΡŒ нСсколько ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ символа Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… трансляции. ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ эти опрСдСлСния Ρ€Π°Π·Π½Ρ‹Π΅. Вакая ситуация ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ повСдСнию. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ всё, Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΆΠ΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

GCC считаСт, Ρ‡Ρ‚ΠΎ Local Π² Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… β€” это ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ класс, Π² Π½Ρ‘ΠΌ Π΅ΡΡ‚ΡŒ функция foo(). ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ опрСдСлСния этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… обязаны Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ взял ΠΏΠ΅Ρ€Π²ΠΎΠ΅ попавшССся β€” ΠΈΠ· main.cpp. Π”Ρ€ΡƒΠ³ΠΎΠΉ компилятор ΠΌΠΎΠ³ Π±Ρ‹ вывСсти Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ класс Local ΠΈΠΌΠ΅Π» external linkage. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ классы Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ΅ пространство ΠΈΠΌΠ΅Π½ (unnamed namespace):

ВсС сущности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΌ пространствС ΠΈΠΌΠ΅Π½, всСгда ΠΈΠΌΠ΅ΡŽΡ‚ internal linkage, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΈΠ· translation unit Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π°Ρ€ΡƒΠΆΡƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ:

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Π² ΠΊΡƒΡ‡Ρƒ

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ допустимыС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ storage duration ΠΈ linkage:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

Для dynamic storage duration Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла концСпция linkage, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ выдСляСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΊΡƒΡ‡Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Для automatic storage duration ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ no linkage, вСдь ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ выдСляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΈ Π² scope, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π° этапС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ автоматичСскиС ΠΈ динамичСскиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ большС Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ, ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Π±ΡƒΠ΄Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎ статичСских ΠΈ thread_local ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ….

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ storage duration Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊ-схСму:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

Если ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ спСцификатор thread_local, Ρ‚ΠΎ Ρƒ Π½Π΅Π΅ thread storage duration. Если это Π½Π΅ Ρ‚Π°ΠΊ, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° scope. Если пСрСмСнная глобальная, Ρ‚ΠΎ Ρƒ Π½Π΅Π΅ всСгда static storage duration. Для локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ‡Π»Π΅Π½Π° класса провСряСм Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ спСцификатора static. Если ΠΎΠ½ Π΅ΡΡ‚ΡŒ, Ρ‚ΠΎ пСрСмСнная статичСская, ΠΈΠ½Π°Ρ‡Π΅ β€” автоматичСская.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ эффСкты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΏΡ€ΠΎΠ½Π°Π±Π»ΡŽΠ΄Π°Π»ΠΈ, ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ вмСстС для Ρ€Π°Π·Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ² сущностСй:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

Колонки Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹ΠΌ Π²ΠΈΠ΄Π°ΠΌ сущностСй, Π° строки β€” свойствам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ сущности. Бвойства Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎ порядку, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ свойства, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΆΠ΅, ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ высокий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Ρ‡Π΅ΠΌ Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΡˆΠ΅.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Из Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ:

А ΠΏΠΎΠ΄ записью Required подразумСваСтся, Ρ‡Ρ‚ΠΎ эти сущности обязаны ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ свойства, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. НапримСр, Ссли Ρƒ поля класса Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ спСцификатора static, Ρ‚ΠΎ ΠΎΠ½ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚ Π² эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ extern

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π³Π΄Π΅ ΠΌΡ‹ сравнивали Π±ΡƒΡ„Π΅Ρ€Ρ‹, ΠΌΡ‹ использовали inline, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²Π΅Π»Π° true. Однако это Π½Π΅ СдинствСнный способ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ.

Π”ΠΎ C++17 Π½Π΅ Π±Ρ‹Π»ΠΎ inline-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΈ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ name ΠΊΠ°ΠΊ extern:

Π’ΠΎΠ³Π΄Π° Π±Ρ‹ пСрСмСнная ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° external linkage ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠ»Π°ΡΡŒ Π² объявлСниС (declaration). Но Π² этом случаС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π³Π΄Π΅-Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ явноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ name, ΠΈ ΠΌΡ‹ вставляСм Π΅Π³ΠΎ Π² a.cpp :

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Какими свойствами ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ extern?

Но это довольно спСцифичСский ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ вмСсто extern Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ inline.

Π”ΠΎΠ±Π°Π²ΠΈΠΌ extern Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ свойств ΠΈ сущностСй:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

Для Π½Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… сущностСй extern Π½Π΅ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ. Для Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΄Π°Π½Π½Ρ‹ΠΉ спСцификатор излишСн, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ любоС объявлСниС глобальной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся extern. Но для Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… спСцификатор Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΈ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ external linkage ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π΅Π΅ Π² объявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Practice time

ΠžΡ‚ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Рассмотрим Ρ‚Π°ΠΊΠΎΠΉ класс:

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. Нас интСрСсуСт ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° member variable. КакиС Π²Ρ‹Π²ΠΎΠ΄Ρ‹ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ?

НС совсСм. constexpr ΠΈ static находятся Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠΈΡ€Π°Ρ…. constexpr дСйствитСлСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ компиляции, ΠΈ послС этого процСсса ΠΎΡ‚ constexpr Π½Π΅ остаСтся ΠΈ слСда (Π½Ρƒ, Ρ‚ΠΎΡ‡Π½Π΅Π΅, ΠΎΡ‚ Π½Π΅Π³ΠΎ останСтся const ΠΈΠ»ΠΈ inline, Π² соотвСтствии с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ свойств). Но ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, Ρ‚Π΅ ΠΆΠ΅ самыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ использовались Π½Π° этапС компиляции, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π½Π° этапС выполнСния. К Π½ΠΈΠΌ становится ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ спСцификатор static, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° стадии выполнСния Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ storage duration.

Π¨Π°Π±Π»ΠΎΠ½Ρ‹

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, классы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ шаблонами. Однако Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… сущностСй (template entity), Π° Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ сущностСй (entity template). Π‘Ρ€Π°Π²Π½ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ шаблон:

Π£ шаблона Π΅ΡΡ‚ΡŒ нСявныС инстанциации. Но ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ сам позаботится ΠΎ Π½ΠΈΡ… Π² Ρ€Π°Π·Π½Ρ‹Ρ… модулях трансляции. Π˜Ρ… linkage Π½Π΅ Ρ‚Π°ΠΊ Π²Π°ΠΆΠ΅Π½ ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ всСгда понятСн.

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ. Π—Π°Π²Π΅Π΄Π΅ΠΌ Ρ‚Ρ€ΠΈ шаблона ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅:

Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ hpp-Ρ„Π°ΠΉΠ» Π² Π΄Π²Π° cpp-Ρ„Π°ΠΉΠ»Π°. Π”Π°Π»Π΅Π΅ инстанцируСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅: b, cb ΠΈ icb. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ трансляции ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ адрСс Ρƒ этих инстанциаций ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ clang Π²Ρ‹Π΄Π°Π»:

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ адрСса. Π—Π½Π°Ρ‡ΠΈΡ‚, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° с ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gcc ΠΈ посмотрим Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Для const bool cb Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ адрСса. Π― Π΄Π°ΠΆΠ΅ Π·Π°Π΄Π°Π» вопрос Π½Π° stackoverflow ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» интСрСсный ΠΎΡ‚Π²Π΅Ρ‚:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

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

Как ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, Ρƒ шаблонов Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв нСявная инстанциация, достаточно ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скобки. Π•ΡΡ‚ΡŒ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ извСстный, Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ β€” объявлСниС явной инстанциации (explicit instantiation declaration).

ΠŸΡƒΡΡ‚ΡŒ Π² header.hpp Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ шаблон большой слоТной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ extern template ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ:

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ это ΠΊΠ°ΠΊ объявлСниС явной инстанциации. Если Π² ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ трансляции ΠΎΠ½ встрСтит ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для этого Ρ‚ΠΈΠΏΠ°, ΠΎΠ½ Π½Π΅ сдСлаСт Π½Π΅ΡΠ²Π½ΡƒΡŽ ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΠ°Ρ†ΠΈΡŽ, Π° просто оставит ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‚ искал ΡΠ²Π½ΡƒΡŽ ΠΈΠ½ΡΡ‚Π°Π½ΠΈΡ†ΠΈΠ°Ρ†ΠΈΡŽ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… трансляции. А это Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстрСС.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас Π΅ΡΡ‚ΡŒ объявлСниС явной инстанциации, ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Ρ‘ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:

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

Π”ΠΎΠ»Π³ΠΈΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ const

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ Π΄ΠΎ C++17 ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΊΡƒΡ‡Π΅ΠΉ Ρ€Π°Π·Π½Ρ‹Ρ… способов:

Π’ΡƒΡ‚ Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ ΡƒΠΆΠ΅ всС Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ стоит.

Π’Π°ΠΊΠΈΠ΅ константы Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ трансляции, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… адрСса.

НСплохо, Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ, ΠΏΡ€ΠΎΠΏΠ°Π΄Π°Π΅Ρ‚, ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

Π’Π΅ΡΡŒΠΌΠ° Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для цСлочислСнных Ρ‚ΠΈΠΏΠΎΠ².

Начиная с C++17 ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ inline, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ для любого Ρ‚ΠΈΠΏΠ°. Π’ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Если ΠΌΡ‹ объявляСм константу Π² cpp-Ρ„Π°ΠΉΠ»Π΅, Ρ‚ΠΎ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ доступна Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ трансляции:

Π£Π±ΠΈΡ€Π°Π΅ΠΌ inline, ΠΈΠ½Π°Ρ‡Π΅ объявлСниС константы ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ трансляции. ΠšΡΡ‚Π°Ρ‚ΠΈ, Π² module interface unit Π² C++20 ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ синтаксис.

Если константа β€” Ρ‡Π»Π΅Π½ класса, Ρ‚ΠΎ ΠΎΠ½Π° ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ static:

Если ΠΊ константС нСльзя ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ constexpr, Ρ‚ΠΎ придСтся Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ inline, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ для поля класса Π΅Π³ΠΎ компилятор Π½Π΅ подставит, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Если ΠΆΠ΅ константа β€” локальная пСрСмСнная, Ρ‚ΠΎ синтаксис ΠΏΠΎΡ…ΠΎΠΆ Π½Π° объявлСниС глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½ΠΎ со static:

Π¦Π΅Π»Ρ‹Ρ… 8 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ². Но всС Π½Π΅ Ρ‚Π°ΠΊ слоТно, ΠΊΠ°ΠΊ каТСтся. АсиммСтрия ΠΌΠ΅ΠΆΠ΄Ρƒ constexpr ΠΈ const Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС, ΠΊΠΎΠ³Π΄Π° константа β€” Ρ‡Π»Π΅Π½ класса.

Когда Π² свСтлом Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, допустим, останутся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², останутся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эти Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹:

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒΡΡ Π² дальнСйшСм, обратимся ΠΊ Π±Π»ΠΎΠΊ-схСмС, которая ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ константу с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

Она описываСт Ρ€ΠΎΠ²Π½ΠΎ Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈ Π²Ρ‹ΡˆΠ΅.

Π—Π°Π³Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· описания

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π² описании Π΄ΠΎΠΊΠ»Π°Π΄Π°:

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΅Π³ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ:

static для глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π°Ρ‘Ρ‚ internal linkage. thread_local Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ thread storage duration. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ x β€” это constexpr volatile шаблон ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с thread storage duration ΠΈ internal linkage (constexpr volatile variable template with thread storage duration and internal linkage).

ИзмСнСния в C++20

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

Π’ C++ 20 добавляСтся Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²ΠΈΠ΄ linkage β€” module linkage. external linkage становится module linkage, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это linkage Π²Π½ΡƒΡ‚Ρ€ΠΈ модуля, Π° всС, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ модуля, становится external linkage.

Для удобства ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ consteval функция нСдоступна Π½Π° этапС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΈ выполнСния, Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ символа Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΈ являСтся своСобразным Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ макросом. На самом Π΄Π΅Π»Π΅ Π² стандартС Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΡ… понятий, ΠΊΠ°ΠΊ β€œΠ²Ρ€Π΅ΠΌΡ компиляции” ΠΈ β€œΠ²Ρ€Π΅ΠΌΡ выполнСния”. Π•ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ β€œΠ½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹ΠΉ эффСкт выполнСния программы”. Однако Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° consteval Π΄Π°Π½Π° Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ компиляторы ΠΈΠΌΠ΅Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Π”ΠΎΠ±Π°Π²ΠΈΠΌ consteval ΠΈ constinit Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ спСцификатор Ρ‚ΠΈΠΏΠ° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½

Как ΠΆΠΈΡ‚ΡŒ с особСнностями C++ ΠΈ Π½Π΅ сойти с ΡƒΠΌΠ°

Π’ этом Π³ΠΎΠ΄Ρƒ Π½Π° ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ Π‘++ Russia 2020 Moscow выступят сам ΡΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ языка Π‘++ Π‘ΡŒΡΡ€Π½Π΅ Бтрауструп ΠΈ ΠΏΡ€Π΅Π΄ΡΠ΅Π΄Π°Ρ‚Π΅Π»ΡŒ ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚Π° ΠΏΠΎ стандартизации Π‘++ Π“Π΅Ρ€Π± Π‘Π°Ρ‚Ρ‚Π΅Ρ€! Π•Ρ‰Π΅ большС Π·Π½Π°ΠΌΠ΅Π½ΠΈΡ‚Ρ‹Ρ… спикСров ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎ Π±ΠΈΠ»Π΅Ρ‚Ρƒ-Π°Π±ΠΎΠ½Π΅ΠΌΠ΅Π½Ρ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π°Π΅Ρ‚ доступ ΠΊΠΎ всСм 8 конфСрСнциям Π»Π΅Ρ‚Π½Π΅Π³ΠΎ сСзона.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *