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

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

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

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

                    // Π² стилС Π‘

}

Когда Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #include Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки составной Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, всС объявлСния ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Ρ„Π°ΠΉΠ»Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π±ΡƒΠ΄ΡƒΡ‚ восприняты ΠΊΠ°ΠΊ написанныС Π½Π° языкС, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ, Ρ‚.Π΅. Ссли Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, Π½Π° Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ это Π½Π΅ повлияСт.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, унаслСдованныС языком Π‘++ ΠΎΡ‚ языка Π‘, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ языка Π‘, Π½ΠΎ это Π½Π΅ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ условиСм для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ языка Π‘++.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ extern "Π‘"

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

// pf ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π‘, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ void ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΡƒΡŽ int

extern "Π‘" void (*pf) (int);

Когда ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ pf ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, созданный ΠΏΡ€ΠΈ компиляции ΠΊΠΎΠ΄ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ происходит ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π‘.

Π’ΠΈΠΏ указатСля Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π‘ Π½Π΅ совпадаСт с Ρ‚ΠΈΠΏΠΎΠΌ указатСля Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π‘++. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π‘ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ (ΠΈΠ»ΠΈ присвоСн) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ указатСля Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π‘++ (ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚). Как ΠΈ ΠΏΡ€ΠΈ любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ нСсовпадСнии Ρ‚ΠΈΠΏΠΎΠ², ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° присвоСния указатСля с Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС:

void (*pf1)(int);            // ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π‘++

extern "Π‘" void (*pf2)(int); // ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π‘

pf1 = pf2; // ошибка: pf1 ΠΈ pf2 ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹

НСкоторыС компиляторы Π‘++ ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ присвоСниС, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅, хотя, строго говоря, ΠΎΠ½ΠΎ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΊΠΎ всСм объявлСниям

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, использованная для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, примСняСтся Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ ΠΊ Π»ΡŽΠ±Ρ‹ΠΌ указатСлям Π½Π° Π½Π΅Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

// f1() - функция Π‘, Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚Π°ΠΊΠΆΠ΅ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π‘

extern "Π‘" void f1(void(*)(int));

Π­Ρ‚ΠΎ объявлСниС ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ f1() являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ языка Π‘, которая Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Она ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² Π²ΠΈΠ΄Π΅ указатСля Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° int. Π­Ρ‚Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ примСняСтся ΠΊΠ°ΠΊ ΠΊ самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f1(), Ρ‚Π°ΠΊ ΠΈ ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π½Π° Π½Π΅Π΅. Когда происходит Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f1(), Π΅ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π‘ ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅Π΅.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ примСняСтся ΠΊΠΎ всСм функциям Π² объявлСнии, для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π‘++ указатСля Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π‘ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° (см. Ρ€Π°Π·Π΄Π΅Π» 2.5.1):

// FC - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π‘

extern "Π‘" typedef void FC(int);

// f2 - функция Π‘++, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π‘

void f2(FC *);

Экспорт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, созданных Π½Π° языкС Π‘++, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ язык

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, написанной Π½Π° языкС Π‘++, эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ доступной для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, написанной Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС.

// функция calc() ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС Π‘

extern "Π‘" double calc(double dparm) { /* ... */ }

Код, создаваСмый компилятором для этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ языку.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π² функциях для Ρ€Π°Π·Π½Ρ‹Ρ… языков Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹. НапримСр, ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка нСльзя Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ класса Π‘++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° языкС Π‘. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π‘ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ ΠΎ конструкторах, дСструкторах ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… спСцифичСских для класса опСрациях.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° прСпроцСссора ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅ Π½Π° языкС Π‘

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„Π°ΠΉΠ» исходного ΠΊΠΎΠ΄Π° Π½Π° языкС Π‘ ΠΈΠ»ΠΈ Π‘++, ΠΏΡ€ΠΈ компиляции Π½Π° языкС Π‘++ прСпроцСссор автоматичСски опрСдСляСт имя __cplusplus (Π΄Π²Π° символа подчСркивания). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΏΡ€ΠΈ компиляции Π½Π° Π‘++ ΠΌΠΎΠΆΠ½ΠΎ условно Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Π‘++:

#ifdef __cplusplus

// ok: компилируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π‘++

extern "Π‘"

#endif

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

ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ

ВзаимодСйствиС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ языка. Если язык ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΎ компилятор, обрабатывая Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ для Ρ‚ΠΎΠ³ΠΎ языка, вСроятнСй всСго, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π΅Π΅.

Π―Π·Ρ‹ΠΊ Π‘ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, поэтому Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ языка Π‘ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Π½Π°Π±ΠΎΡ€Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

// ошибка: Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ extern "Π‘" ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π΄Π²Π΅ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

extern "Π‘" void print(const char*);

extern "Π‘" void print(int);

Если ΠΎΠ΄Π½Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Π½Π°Π±ΠΎΡ€Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ языка Π‘, всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ функциями Π‘++:

class SmallInt { /* ... */ };

class BigNum { /* ... */ };

// функция Π‘ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π‘ ΠΈ Π‘++

// вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π‘++, ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‰Π°Ρ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ

// Π²Ρ‹Π·Π²Π°Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° языкС Π‘++

extern "Π‘" double calc(double);

extern SmallInt calc(const SmallInt&);

extern BigNum calc(const BigNum&);

ВСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ calc() для языка Π‘ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° ΠΊΠ°ΠΊ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° языкС Π‘, Ρ‚Π°ΠΊ ΠΈ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° языкС Π‘++. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° класса ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° языкС Π‘++, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ порядок объявлСния Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 19.8.3

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 19.26. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ эти объявлСния ΠΈ ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅, допустимы Π»ΠΈ ΠΎΠ½ΠΈ:

extern "Π‘" int compute(int *, int);

extern "Π‘" double compute(double *, double);

РСзюмС

Π―Π·Ρ‹ΠΊ Π‘++ прСдоставляСт нСсколько спСциализированных срСдств, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ряда спСцифичСских ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

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

НСкоторым ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ нСпосрСдствСнно Π²Ρ‹ΡΡΠ½ΡΡ‚ΡŒ динамичСский Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²ΠΎ врСмя выполнСния. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ Ρ‚ΠΈΠΏΠΎΠ² Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния (Run-Time Type Identification β€” RTTI) прСдоставляСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ этого Π²ΠΈΠ΄Π° программирования Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ языка. RTTI ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Ρ‚Π΅ΠΌ классам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ функциями; информация ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… Π±Π΅Π· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ доступна, Π½ΠΎ ΠΎΠ½Π° соотвСтствуСт статичСскому Ρ‚ΠΈΠΏΡƒ.

ΠŸΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ указатСля Π½Π° Ρ‡Π»Π΅Π½ класса Π² состав Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ класс, Π½Π° Ρ‡Π»Π΅Π½ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‡Π»Π΅Π½ класса ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связан с Ρ‡Π»Π΅Π½ΠΎΠΌ любого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса. ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ указатСля Π½Π° Ρ‡Π»Π΅Π½ класса Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎ Ρ‡Π»Π΅Π½Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ.

Π’ языкС Π‘++ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ нСсколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… составных Ρ‚ΠΈΠΏΠΎΠ².

β€’ Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² области видимости Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса. Π’Π°ΠΊΠΈΠ΅ классы Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ содСрТащСго класса.

β€’ ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΠ΄ класса, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ простыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹. Π’ любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ². Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, объСдинСния входят Π² состав Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса.

β€’ Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ классы ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΎΡ‡Π΅Π½ΡŒ простыС классы, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ локально Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ВсС Ρ‡Π»Π΅Π½Ρ‹ локального класса Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Π΅Π³ΠΎ Ρ‚Π΅Π»Π΅. Для локального класса нСдопустимы статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹.

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

Π’Π΅Ρ€ΠΌΠΈΠ½Ρ‹

АнонимноС объСдинСниС (anonymous union). БСзымянноС объСдинСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π§Π»Π΅Π½Ρ‹ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ объСдинСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ области видимости. Π’Π°ΠΊΠΈΠ΅ объСдинСния Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ², Π½ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΈΠ»ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ².