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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΎΠ΅ руководство ΠΏΠΎ C++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 12

Автор Π‘ΡŒΡΡ€Π½ Бтраустрап

БущСствуСт Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ языка, ΠΊΠ°ΡΠ°ΡŽΡ‰Π°ΡΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°-выраТСния ΠΈ описания, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, содСрТащий ΠΊΠ°ΠΊ самоС Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ явноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС (Β§R.5.2.3), ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΌ ΠΎΡ‚ описания, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ начинаСтся со (. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ считаСтся описаниСм.

Для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ нСоднозначности слСдуСт ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ вСсь ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ являСтся ΠΎΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠ»ΠΈ описаниСм. Π’Π°ΠΊ устраняСтся Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях. НапримСр, ΠΏΡƒΡΡ‚ΡŒ T - имя-простого-Ρ‚ΠΈΠΏΠ° (Β§R.7.1.6), Ρ‚ΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π΅ΠΌ

T(a)-β€Ίm = 7; // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

T(a)++; // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

T(a,5) β€Ήβ€Ή c; // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

T(*e)(int); // описаниС

T(f)[]; // описаниС

T(g) = { 1, 2 }; // описаниС

T(*d)(double(3)); // описаниС

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ случаи ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ описания. НапримСр,

T(a); // описаниС

T(*b)(); // описаниС

T(c)=7; // описаниС

T(d),e,f=3; // описаниС

T(g)(h,2); // описаниС

ΠΠ΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ здСсь чисто синтаксичСская, Ρ‚.Π΅. Π½Π° Π΅Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ влияСт Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, являСтся Π»ΠΈ имя ΠΈΠΌΠ΅Π½Π΅ΠΌ-Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ Π½Π΅Ρ‚.

Π•ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΈΠ΄ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ описаниСм, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ описаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π±Π»ΠΎΠΊΠ΅ (Β§R.6.3) ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Π»ΠΎΡΡŒ ΠΈΠΌΠ΅Π½Π΅ΠΌ-Ρ‚ΠΈΠΏΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

void g()

{

 int f(); // описаниС

 int a; // описаниС

 f(); // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

 a; // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

}

R.7 Описания

Описания ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²; Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Π»ΠΈΡΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ памяти, сопоставляСмой с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. Описания ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΈΠ΄

описания:

 ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ-описания opt список-описатСлСй opt;

 ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅-asm

 ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

 ΡΠΏΠ΅Ρ†ΠΈΡ„икация-связи

ΠžΠΏΠΈΡΠ°Ρ‚Π΅Π»ΠΈ Π² спискС-описатСлСй (Β§R.8) содСрТат описываСмыС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ спСцификации-описания ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Β§R.8.3) ΠΈΠ»ΠΈ Π² описании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Бписок-описатСлСй ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пустым, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ описании класса (Β§R.9) ΠΈΠ»ΠΈ пСрСчислСния (Β§R.7.2), Ρ‚.Π΅. ΠΊΠΎΠ³Π΄Π° спСцификация-описания Π΅ΡΡ‚ΡŒ спСцификация-класса ΠΈΠ»ΠΈ спСцификация-пСрСчислСния. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ описаниС-asm ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π² Β§R.7.3, Π° спСцификация-связи Π² Β§R.7.4. ОписаниС происходит Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ области видимости (Β§R.3.2), ΠΏΡ€Π°Π²ΠΈΠ»Π° области видимости приводятся Π² Β§R.10.4.

R.7.1 Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ

Π’ описании ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ спСцификации:

спСцификация-описания:

 ΡΠΏΠ΅Ρ†ΠΈΡ„икация-класса-памяти

 ΡΠΏΠ΅Ρ†ΠΈΡ„икация-Ρ‚ΠΈΠΏΠ°

 ΡΠΏΠ΅Ρ†ΠΈΡ„икация-fct

 ΡΠΏΠ΅Ρ†ΠΈΡ„икация-шаблона-Ρ‚ΠΈΠΏΠ°

 friend

 typedef

спСцификации-описания:

 ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ-описания opt спСцификация-описания

Бамая длинная ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ конструкций спСцификация-описания, которая, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ‚ΠΈΠΏΠ°, ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π² описании ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ спСцификации-описания. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ согласованной, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π½ΠΈΠΆΠ΅. НапримСр,

typedef char* Pc;

static Pc; // ошибка: Π½Π΅Ρ‚ ΠΈΠΌΠ΅Π½ΠΈ

Π—Π΄Π΅ΡΡŒ описаниС static Pc являСтся Π½Π΅Π·Π°ΠΊΠΎΠ½Π½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ статичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° Pc. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° int с ΠΈΠΌΠ΅Π½Π΅ΠΌ Pc, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ-Ρ‚ΠΈΠΏΠ° int, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ (ΠΏΠ΅Ρ€Π΅)опрСдСляСтся имя Pc ΠΈΠ· typedef, Π° Π½Π΅ просто Pc являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· элСмСнтов ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ конструкций спСцификация-описания, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,

void f(const Pc); // void f(char* const)

void g(const int Pc); // void g(const int)

Π£ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ signed, unsigned, long ΠΈ short ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ int, конструкция имя-typedef, которая появляСтся послС ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· пСрСчислСнных спСцификаций Ρ‚ΠΈΠΏΠ°, Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ (ΠΏΠ΅Ρ€Π΅)опрСдСляСмоС имя, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,

void h(unsigned Pc); // void h(unsigned int)

void k(unsigned int Pc); // void k(unsigned int)

R.7.1.1 Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ класса памяти

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ класса памяти ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅:

спСцификация-класса-памяти:

 auto

 register

 static

 extern

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ auto ΠΈ register ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΈΠΌΠ΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ описаны Π² Π±Π»ΠΎΠΊΠ΅ (Β§R.6.3), ΠΈΠ»ΠΈ для Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (Β§R.8.3). ΠŸΠΎΡ‡Ρ‚ΠΈ всСгда спСцификация auto ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ часто, Ρ‚Π°ΠΊ, auto ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ явно ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€-описаниС ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°-выраТСния (Β§R.6.2).

ОписаниС register являСтся описаниСм auto, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ подсказываСт транслятору, Ρ‡Ρ‚ΠΎ описываСмыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ достаточно интСнсивно. Подсказка ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π°, ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… рСализациях ΠΎΠ½Π° игнорируСтся Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° бСрСтся адрСс ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ОписаниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° считаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ΠΎ Π½Π΅ содСрТит спСцификации extern ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Β§R.3.1).

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΡŽ памяти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Β§R.8.4).

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ static ΠΈ extern ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ ΠΊ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌ объСдинСниям. Π’Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ° нСдопустимы описания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ со спСцификациСй static ΠΈΠ»ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² со спСцификациСй static ΠΈΠ»ΠΈ extern. БтатичСскиС Ρ‡Π»Π΅Π½Ρ‹ класса ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Β§R.9.4. БпСцификация extern нСдопустима для Ρ‡Π»Π΅Π½ΠΎΠ² класса.

Имя со спСцификациСй static ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌΡƒ ΡΠ²ΡΠ·Ρ‹Π²Π°Π½ΠΈΡŽ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, описанныС ΠΊΠ°ΠΊ const, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌΡƒ ΡΠ²ΡΠ·Ρ‹Π²Π°Π½ΠΈΡŽ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π±Ρ‹Π»ΠΈ описаны с внСшнСй связью. Имя со спСцификациСй extern ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ‚ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΡΠ²ΡΠ·Ρ‹Π²Π°Π½ΠΈΡŽ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π½Π΅Π΅ ΠΎΠ½ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ описано с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ связью. Имя с Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости ΠΈ Π±Π΅Π· спСцификации-класса-памяти ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ‚ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΡΠ²ΡΠ·Ρ‹Π²Π°Π½ΠΈΡŽ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π½Π΅Π΅ ΠΎΠ½ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ описано с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ связью ΠΈΠ»ΠΈ со спСцификациСй const. Π’ смыслС связывания для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ, спСцификация inline эквивалСнтна static (Β§R.3.3). Для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ всС Π΅Π³ΠΎ спСцификации, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ связываниС, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ согласованы. НапримСр,

static char* f(); // f() ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ связываниС

char* f() // f() всС Π΅Ρ‰Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅

{/*… */}

char* g(); // g() ΠΈΠΌΠ΅Π΅Ρ‚ внСшнСС связываниС

static char* g() // ошибка: ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ΅ Π² связывании

{/*… */}

static int a; // `a' ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ связываниС

int a; // ошибка: Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅

static int b; // `b' ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ связываниС

extern int b; // `b' всС Π΅Ρ‰Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅

int c; // `c' ΠΈΠΌΠ΅Π΅Ρ‚ внСшнСС связываниС

static int c; // ошибка: ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ΅ Π² связывании

extern int d; // `d' ΠΈΠΌΠ΅Π΅Ρ‚ внСшнСС связываниС

static int d; // ошибка: ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ΅ Π² связывании

Имя Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² описании extern. Однако, Ρ‚Π°ΠΊΠΎΠ΅ описаниС нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ класс Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,

struct S;

extern S a;

extern S f();

extern void g(S);

void h()

{

 g(a); // ошибка: S Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ

 f(); // ошибка: S Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ

}

R.7.1.2 Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

НСкоторыС спСцификации ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² описании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

спСцификация-fct:

 inline

 virtual

БпСцификация inline подсказываСт транслятору, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ произвСсти подстановку Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Подсказка ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π’ случаС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ, спСцификация inline Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ устанавливаСт для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ связываниС (Β§R.3.3). Ѐункция (Β§R.5.2.2, Β§R.8.2.5), опрСдСлСнная Π² описании класса, ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ inline.

Ѐункция-Ρ‡Π»Π΅Π½ со спСцификациСй inline Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Π² точности Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ трансляции, Π³Π΄Π΅ ΠΎΠ½Π° появляСтся.

Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ явно ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ со спСцификациСй inline ΠΏΡ€ΠΈ описании класса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Π»Π°ΡΡŒ ΠΊΠ°ΠΊ подстановка. Если спСцификации inline Π½Π΅ Π±Ρ‹Π»ΠΎ, связываниС Π±ΡƒΠ΄Π΅Ρ‚ внСшним, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ со спСцификациСй inline Π½Π΅ появится ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

class X {

public:

 int f();

 inline int g(); // X::g() ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ связываниС

 int h();

};


void k(X* p)

{

 int i = p-β€Ίf(); // Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ X::f() внСшнСС связываниС

 int j = p-β€Ίg();

 //…

}


inline int X::f() // ошибка: Π²Ρ‹Π·ΠΎΠ² Π΄ΠΎ опрСдСлСния

 // ΠΊΠ°ΠΊ inline

{

 //…

}


inline int X::g()

{

 //…

}


inline int X::h() // Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ X::h() ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ связываниС