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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 287

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

Для Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ. ПовСдСниС Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ, Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, опрСдСляСт конкрСтная рСализация.

ИспользованиС Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ

К Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ полям ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ-Ρ‡Π»Π΅Π½Π°ΠΌ класса:

void File::write() {

 modified = 1;

 // ...

}

void File::close() {

 if (modified)

  // ... ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ содСрТимоС

}

Для манипулирования Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ полями с нСсколькими Π±ΠΈΡ‚Π°ΠΌΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ встроСнныС ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ (см. Ρ€Π°Π·Π΄Π΅Π» 4.8):

File &File::open(File::modes m) {

 mode |= READ; // ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ READ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

 // другая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°

 if (m & WRITE) // Ссли ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ для чтСния ΠΈ записи

  // процСсс открытия Ρ„Π°ΠΉΠ»Π° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ чтСния/записи

 return *this;

}

ΠšΠ»Π°ΡΡΡ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π±ΠΎΡ€ встраиваСмых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ установки Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ:

inline bool File::isRead() const { return mode & READ; }

inline void File::setWrite() { mode |= WRITE; }

19.8.2. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ volatile

Бмысл спСцификатора volatile ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ выяснСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ компилятора. ΠŸΡ€ΠΈ пСрСносС Π½Π° Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈΠ»ΠΈ компиляторы ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ спСцификатор volatile, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ приходится ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ.

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

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ volatile ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ спСцификатору const, Ρ‚.Π΅. ΠΊΠ°ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ°:

volatile int display_register; // Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ int ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ

volatile Task *curr_task;   // curr_task ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ volatile

volatile int iax[max_size]; // ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² iax volatile volatile

Screen bitmapBuf;           // ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‡Π»Π΅Π½ bitmapBuf volatile

ΠœΠ΅ΠΆΠ΄Ρƒ спСцификаторами Ρ‚ΠΈΠΏΠ° const ΠΈ volatile Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ взаимосвязи. Π’ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ const, ΠΈ volatile, Ρ‚ΠΎΠ³Π΄Π° Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ±Π° качСства.

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ константныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹, Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ асинхронно-измСняСмыС (volatile). Волько асинхронно-измСняСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ асинхронно-измСняСмым (volatile) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ.

ВзаимодСйствиС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ со спСцификатором const описано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.4.2. АналогичноС взаимодСйствиС сущСствуСт ΠΌΠ΅ΠΆΠ΄Ρƒ указатСлями ΠΈ спСцификатором volatile. МоТно ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ асинхронно-измСняСмыС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° асинхронно-измСняСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ асинхронно-измСняСмыС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° асинхронно-измСняСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

volatile int v;    // v - асинхронно-измСняСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° int

int *volatile vip; // vip - асинхронно-измСняСмый ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΈΠΏ int

volatile int *ivp; // ivp - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° асинхронно-измСняСмый Ρ‚ΠΈΠΏ int

// vivp - асинхронно-измСняСмый ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° асинхронно-измСняСмый

// ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° int

volatile int *volatile vivp;

int *ip = &v; // ошибка: Π½ΡƒΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° volatile

*ivp = &v;    // ok: ivp - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° volatile

vivp = &v;    // ok: vivp - volatile ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° volatile

Подобно константам, адрСс асинхронно-измСняСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ (ΠΈΠ»ΠΈ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° асинхронно-измСняСмый Ρ‚ΠΈΠΏ) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ асинхронно-измСняСмому ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ. ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ссылки Π½Π° асинхронно-измСняСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ асинхронно-измСняСмыС ссылки.

Π‘ΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΊ асинхронно-измСняСмым ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ

ΠœΠ΅ΠΆΠ΄Ρƒ константными ΠΈ асинхронно-измСняСмыми ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π²Π°ΠΆΠ½ΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅: для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ присвоСния асинхронно-измСняСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ синтСзируСмыС вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² присвоСния, копирования ΠΈ пСрСмСщСния. Π‘ΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ константныС ссылки Π½Π° класс. Однако асинхронно-измСняСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΈΠ»ΠΈ константной ссылки.

Если класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ присвоСниС асинхронно-измСняСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² (ΠΈΠ»ΠΈ ΠΈΠ·) асинхронно-измСняСмый ΠΎΠΏΠ΅Ρ€Π°Π½Π΄, Π² Π½Π΅ΠΌ слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ собствСнныС вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² копирования ΠΈ пСрСмСщСния. НапримСр, объявив ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠ°ΠΊ ссылки const ΠΈ volatile, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ присвоСниС ΠΈΠ· любого Π²ΠΈΠ΄Π° Ρ‚ΠΈΠΏΠ° Foo:

class Foo {

public:

 Foo(const volatile Foo&); // ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° volatile

 // присвоСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° volatile ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ

 Foo& operator=(volatile const Foo&);

 // присвоСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° volatile ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ volatile

 Foo& operator=(volatile const Foo&) volatile;

 // ΠΎΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ класса Foo

};

Π₯отя для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² volatile Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ копирования ΠΈ присвоСния, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π²ΠΏΠΎΠ»Π½Π΅ Ρ€Π΅Π·ΠΎΠ½Π½Ρ‹ΠΉ вопрос: ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ смысл ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ volatile? ΠžΡ‚Π²Π΅Ρ‚ зависит ΠΎΡ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ использования Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

19.8.3. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ: extern "C"

Иногда Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π‘++ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, написанныС Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС программирования. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, это язык Π‘. Подобно Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ, имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, написанной Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС, слСдуСт ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎ объявлСниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΈ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ провСряСт обращСния ΠΊ внСшним функциям Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ обращСния ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ функциям языка Π‘++. Однако для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, написанных Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, компилятор ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠ½ΠΎΠΉ ΠΊΠΎΠ΄. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ язык для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, написанных Π½Π° языкС, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΎΡ‚ Π‘++, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ (linkage directive).

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ ΠΊΠΎΠ΄Π° Π‘++ с ΠΊΠΎΠ΄ΠΎΠΌ, написанным Π½Π° любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ язык Π‘, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ доступа ΠΊ компилятору этого языка, совмСстимому с вашим компилятором Π‘++.

ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, написанных Π½Π° языкС, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΎΡ‚ Π‘++

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΄Π²ΡƒΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ…: ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ ΠΈ составной. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НСкоторыС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ объявлСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ языка Π‘, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ cstdlib:

// гипотСтичСскиС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹

// ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π‘++ <cstring>

// одиночная Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ

extern "Π‘" size_t strlen(const char *);

// составная Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ

extern "Π‘" {

 int strcmp(const char*, const char*);

 char *strcat(char*, const char*);

}

ΠŸΠ΅Ρ€Π²Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° состоит ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова extern, сопровоТдаСмого строковым Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠΌ ΠΈ "ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ" объявлСниСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹ΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Π» ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ язык, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ написана функция. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ компилятор обязан ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ для языка Π‘. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… языков, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ extern "Ada", extern "FORTRAN" ΠΈ Ρ‚.Π΄.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ

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

Боставная Ρ„ΠΎΡ€ΠΌΠ° объявлСния ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΊΠΎ всСму Ρ„Π°ΠΉΠ»Ρƒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°. НапримСр, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ cstring языка Π‘++ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

// составная Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ

extern "Π‘" {

#include <string.h> // Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ языка Π‘, ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ строками

                    // Π² стилС Π‘