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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 22

Автор ΠœΡŽΡ€Ρ€Π΅ΠΉ Π₯ΠΈΠ»Π»

// file1.c: int a = 1; int b = 1; extern int c;

// file2.c: int a; extern double b; extern int c;

Π—Π΄Π΅ΡΡŒ Ρ‚Ρ€ΠΈ ошибки: a ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π΄Π²Π°ΠΆΠ΄Ρ‹ (int a; являСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ int a=0;), b описано Π΄Π²Π°ΠΆΠ΄Ρ‹ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, Π° c описано Π΄Π²Π°ΠΆΠ΄Ρ‹, Π½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ. Π­Ρ‚ΠΈ Π²Π΄Ρ‹ ошибок Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ компилятором, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π²ΠΈΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ». ΠšΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΈΡ… ΠΎΠ½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ являСтся Π‘++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ (хотя C ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ являСтся):

// file1.c: int a; int f() (* return a; *)

// file2.c: int a; int g() (* return f(); *)

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, file2.c Π½Π΅ Π‘++, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ f() Π½Π΅ Π±Ρ‹Π»Π° описана, ΠΈ поэтому компилятор Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π΄ΠΎΠ²ΠΎΠ»Π΅Π½. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, (ΠΊΠΎΠ³Π΄Π° file2.c фиксирован) ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ скомпонована, посколку a ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π΄Π²Π°ΠΆΠ΄Ρ‹.

Имя ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π² Ρ„Π°ΠΉΠ»Π΅, описав Π΅Π³ΠΎ static. НапримСр:

// file1.c: static int a = 6; static int f() (* /* ... */ *)

// file2.c: static int a = 7; static int f() (* /* ... */ *)

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ a ΠΈ f описано ΠΊΠ°ΠΊ static, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π°ΡΡΡ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° являСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ своя a ΠΈ своя f().

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

Рассмотрим Π΄Π²Π° Ρ„Π°ΠΉΠ»Π°:

// file1.c: const int a = 6; inline int f() (* /* ... */ *) struct s (* int a,b; *)

// file1.c: const int a = 7; inline int f() (* /* ... */ *) struct s (* int a,b; *)

Π Π°Π· ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Β«Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅Β» примСняСтся ΠΊ ΠΊΠΎΠ½Ρ‚Π°Π½Ρ‚Π°ΠΌ, inline-функциям ΠΈ опрСдСлСниям Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ примСняСтся ΠΊ функциям ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, Ρ‚ΠΎ file1.c ΠΈ file2.c Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ частями ΠΎΠ΄Π½ΠΎΠΉ Π‘++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Но Ссли это Ρ‚Π°ΠΊ, Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΆΠ΅ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ константы? ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΎ, ΠΎΡ‚Π²Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ²: Ρ‚ΠΈΠΏΡ‹, константы ΠΈ Ρ‚.ΠΏ. ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·, сколько Π½ΡƒΠΆΠ½ΠΎ, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ. ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ нСсколько Π±ΠΎΠ»Π΅Π΅ слоТСн (это ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅).

4.3 Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π€Π°ΠΉΠ»Ρ‹

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

– * Π›Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ, Π½ΠΎ сдСлав это ΠΈ напсав ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая зависит ΠΎΡ‚ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΊΠ°ΠΊ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ мСсто? (ΠΏΡ€ΠΈΠΌ. Π°Π²Ρ‚Ρ€Π°)

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ #include – это Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ простоС срСдство ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ тСкста для сборки кусков исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΎΠ΄Π½Ρƒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ (Ρ„Π°ΠΉΠ») для Π΅Π΅ компиляции. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°

#include Β«to_be_includedΒ»

Π·Π°ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ строку, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΠ»ΠΎΡΡŒ #include, содСТимым Ρ„Π°ΠΉΠ»Π° Β«to_be_includedΒ». Π•Π³ΠΎ содСрТимым Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΡ…ΠΎΠ΄Π½Ρ‹ΠΉ тСкст Π½Π° Π‘++, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ дальшС Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ комплятор. Часто Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ обрабатываСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ C прСпроцСссором, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π° CC Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ для прСобразования исходного Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π°Π» программист, Π² Ρ„Π°ΠΉΠ» Π±Π΅Π· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Ρ‚ΡŒ собствСнно ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ. Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ эти Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ итСрфСйсная систСма компилятора ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²ΡΡ‚Ρ€Π΅Ρ‡ΡŽΡ‚ΡΡ Π² исходном тСкстС. Если программист Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ

CC -E file.c

для прСпроцСссирования Ρ„Π°ΠΉΠ»Π° file.c Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ это сдСлала Π±Ρ‹ CC ΠΏΠ΅Ρ€Π΅Π΄ запуском собствСнно компилятора. Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· стандартной Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ вмСсто ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скобки Β« ΠΈ Β». НапримСр:

#include Β«stream.hΒ» //ΠΈΠ· стандартной Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ #define Β«myheader.hΒ» // ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ

ИспользованиС «» ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎ прСимущСство, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ фактичСскоС имя Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅ встраиваСтся (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, сначала просматриваСтся /usr/include/CC, Π° ΠΏΠΎΡ‚ΠΎΠΌ usr /include). К соТалСнию, ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ include сущСсвСнны:

#include Β« stream.h Β» // Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚ Β«stream.hΒ»

ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π·Π°Π½ΠΎΠ²ΠΎ ΠΊΠ°Π΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΊΡƒΠ΄Π°-Π»ΠΈΠ±ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ, Ρ€Π°ΡΡ‚ΠΎΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ врСмя компиляции Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ слабо отличаСтся ΠΎΡ‚ Π²Ρ€ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для чтСния Π΅Π³ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ яляСтся довольно ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΌ прСдставлСниСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ содСрТат Ρ‚ΠΎΠ»ΡŒΠΊΠΎ описания ΠΈ Π½Π΅ сдСрТат ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… ΠΎΡ‚ компилятора Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Π½Π»ΠΈΠ·Π°.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ эмпиричСскоС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ слСдуСт, Π° Ρ‡Ρ‚ΠΎ Π½Π΅ слСдуСт ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, яляСтся Π½Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ языка, Π° просто ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ Ρ€Π°Π·ΡƒΠ½ΠΎΠΌΡƒ использованию Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π° #include.

Π’ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ:

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠΎΠ² struct point (* int x, y; *) Описания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ extern int strlen(const char*); ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ inline-Ρ„ΡƒΠ½ΠΊ-ΠΉ inline char get()(*return *p++;*) Описания Π΄Π°Π½Π½Ρ‹Ρ… extern int a; ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ констант const float pi = 3.141593 ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ enum bool (* false, true *); Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ include #include Β«signal.hΒ» ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ макросов #define Case break;case ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ /* ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π° */

Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π°

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ char get() (* return *p++; *) ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… int a;

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ слоТных константных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² const tbl[]=(*/* ... */ *)

Π’ систСмС UNIX принято, Ρ‡Ρ‚ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ суффикс (Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅) .h. Π€Π°ΠΉΠ»Ρ‹, содСрТащиС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ суффикс .c. Π’Π°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ часто Π½Π°Π·Π²Π°ΡŽΡ‚, соотвСтствСнно, Β«.h Ρ„Π°ΠΉΠ»Ρ‹Β» ΠΈ Β«.c Ρ„Π°ΠΉΠ»Ρ‹Β». Π’ #4.7 ΠΎΠΏΠΈΡΠ²Π°ΡŽΡ‚ΡΡ макросы. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π‘++ макросы Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, Ρ‡Π΅ΠΌ Π² C, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π‘++ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ языковыС конструкции, ΠΊΠ°ΠΊ const для опрСдСлСния констант ΠΈ inline для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ расходов Π½Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… допускаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ простых констант, Π½ΠΎ Π½Π΅ допускаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ слоТных константных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², прагматичСская. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ допустимым Π΄ΡƒΠ±Π»ΠΈΡ€Π²Π°Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (Π΄Π°ΠΆΠ΅ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ). Однако для ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠ² старого ΠΎΠ±Ρ€Π°Ρ†Π° слишком Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ‚ΠΎΠΆΠ΄Π΅ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… констант ΠΈ ΡƒΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Ρ‹. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, простыС слчаи Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΠΈΡ…ΠΎΠ΄Π½Ρ‹ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°.

4.3.1 Один Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π€Π°ΠΉΠ»

ΠŸΡ€ΠΎΡ‰Π΅ всСго Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ разбиСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° нСколько Ρ„Π°ΠΉΠ»ΠΎΠ² помСстив Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ опрСдСлСния Π΄Π°Π½Π½Ρ‹Ρ… Π² подхдящСС число исходных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ описав Ρ‚ΠΈΠΏΡ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для ΠΈΡ… взаимодСйствия, Π² ΠΎΠ΄Π½ΠΎΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΡΡ Π²ΠΎ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ .c Ρ„Π°ΠΉΠ»Π°: lex.c, syn.c, table.c ΠΈ main.c, ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» dc.h, содСрТащий описания всСх ΠΈΠΌΠ΅Π½, ΠΊΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π² ΠΎΠ΄Π½ΠΎΠΌ .c Ρ„Π°ΠΉΠ»Π΅:

// dc.h: ΠΎΠ±Ρ‰ΠΈΠ΅ описания для ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°

enum token_value (* NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')' *);

extern int no_of_errors; extern double error(char* s); extern token_value get_token(); extern token_value curr_tok; extern double number_value; extern char name_string[256];

extern double expr(); extern double term(); extern double prim();

struct name (* char* string; name* next; double value; *);

extern name* look(char* p, int ins = 0); inline name* insert(char* s) (* return look(s,1); *)

Если ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ фактичСский ΠΊΠΎΠ΄, Ρ‚ΠΎ lex.c Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

// lex.c: Π²Π²ΠΎΠ΄ ΠΈ лСксичСский Π°Π½Π°Π»ΠΈΠ· #include Β«dc.hΒ»

#include Β«ctype.hΒ»

token_value curr_tok; double number_value; char name_string[256];

token_value get_token() (* /* ... */ *)

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ использованиС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ описаниС Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΎΠ±ΡŠΠ΅Ρ‚Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² Ρ„Π°ΠΉΠ», Π³Π΄Π΅ ΠΎΠ½ опрСдСляСтся. НапримСр, ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Ρ†ΠΈΠΈ lex.c компилятору Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ:

extern token_value get_token(); // ... token_value get_token() (* /* ... */ *)

Π­Ρ‚ΠΎ обСспСчиваСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ компилятор ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ Π»ΡŽΠ±ΡƒΡŽ Π½ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΈΠΏΠ°Ρ…, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… для ΠΈΠΌΠ΅Π½ΠΈ. НапримСр, Ссли Π±Ρ‹ get_token() Π±Ρ‹Π»Π° описана ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ token_value, Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ int, компиляция lex.c Π½Π΅ ΠΏΡ€ΠΎΡˆΠ»Π° Π±Ρ‹ ΠΈΠ·Π·Π° ошибки нСсоотвСтствия Ρ‚ΠΈΠΏΠΎΠ².

Π€Π°ΠΉΠ» syn.c Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

// syn.c: синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΈ вычислСниС

#include Β«dc.hΒ»

double prim() (* /* ... */ *) double term() (* /* ... */ *) double expr() (* /* ... */ *)

Π€Π°ΠΉΠ» table.c Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

// table.c: Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠΌΠ΅Π½ ΠΈ просмотр

#include Β«dc.hΒ»

extern char* strcmp(const char*, const char*); extern char* strcpy(char*, const char*); extern int strlen(const char*);

const TBLSZ = 23; name* table[TBLSZ];

name* look(char* p; int ins) (* /* ... */ *)

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ table.c сам описываСт стандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками, поэтому Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ согласованости этих описаний Π½Π΅Ρ‚. ΠŸΠΎΡ‡Ρ‚ΠΈ всСгда Π»ΡƒΡ‡ΡˆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»Π²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Ρ‡Π΅ΠΌ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ имя Π² .c Ρ„Π°ΠΉΠ»Π΅ ΠΊΠ°ΠΊ extern. ΠŸΡ€ΠΈ этом ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ «слишком ΠΌΠ½ΠΎΠ³ΠΎΒ», Π½ΠΎ это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ ΠΎΠΊΠ·Ρ‹Π²Π°Π΅Ρ‚ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠ³ΠΎ влияния Π½Π° врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для ΠΊΠΎΠΌΠΏΠΈΠ»Ρ†ΠΈΠΈ, ΠΈ ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ экономит врСмя программиста. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° этого, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ strlen() Π·Π°Π½ΠΎΠ²ΠΎ описываСтся Π² main() (Π½ΠΈΠΆΠ΅). Π­Ρ‚ΠΎ лишниС наТатия клавиш ΠΈ Π²ΠΎΠΌΠΎΠΆΠ½Ρ‹ΠΉ источник нСприятностСй, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ этих Π΄Π²ΡƒΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ. На самом Π΄Π»Π΅, этой слоТности ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, Π±ΡƒΠ΄ΡŒ всС описания extern ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² dc.h, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π»ΠΎΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π­Ρ‚Π° Β«Π½Π΅Ρ€Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒΒ» сохранСна Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΎΡ‡Π΅Π½ΡŒ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎ для C ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΎΡ‡Π΅Π½ΡŒ ΡΠΎΠ±Π»Π°Π·Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для программиста, ΠΈ Ρ‡Π°Ρ‰Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚, Ρ‡Π΅ΠΌ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚, ΠΊ ошибкам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠ±Π½Π°Ρ€ΠΆΠΈΡ‚ΡŒ, ΠΈ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ тяТСло Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Вас ΠΏΡ€Π΅Π΄ΡƒΡ€Π΅Π΄ΠΈΠ»ΠΈ!