Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Delphi часто сталкиваСт ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² с Π·Π°Π³Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΌΠΈ сообщСниями компилятора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΡƒΠ³Π°ΡŽΡ‰ΠΈΠΌΠΈ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°ΠΌ ΠΈ Π΄Π°ΠΆΠ΅ ΠΎΡ‚Π²Π»Π΅Ρ‡ΡŒ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Одной ΠΈΠ· самых распространСнных ΠΈ часто misunderstood ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ являСтся ошибка, ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‰Π°Ρ ΠΎΠ± unsatisfied forward or external declaration. Π­Ρ‚ΠΎΡ‚ сбой Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π° этапС Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° компилятор ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ объявлСниС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Π΅Ρ‘ Ρ„Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. ПониманиС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ компилятора ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ° критичСски Π²Π°ΠΆΠ½ΠΎ для быстрого устранСния ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… сбоСв.

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

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ этой ошибки Π½Π° Ρ€Π°Π½Π½ΠΈΡ… стадиях Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ станСт Π½Π΅ собираСмым, блокируя Ρ€Π°Π±ΠΎΡ‚Ρƒ всСй ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π°Π΄ Π½ΠΎΠ²Ρ‹ΠΌΠΈ функциями.

ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ компилятора ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ°

Π§Ρ‚ΠΎΠ±Ρ‹ эффСктивно Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с ошибками компиляции, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит "ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ" ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Delphi Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Π΄Π²Π° основных этапа: сначала ΠΎΠ½ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ исходный ΠΊΠΎΠ΄, провСряя синтаксис ΠΈ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π·Π°Ρ‚Π΅ΠΌ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ собираСт всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ». ИмСнно Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ этапС, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ внСшниС ссылки, ΠΈ всплываСт сообщСниС ΠΎΠ± unsatisfied forward declaration. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ символов Π΅ΡΡ‚ΡŒ запись ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ адрСс Π΅Ρ‘ ΠΊΠΎΠ΄Π° Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ.

Часто Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ порядок слСдования ΠΊΠΎΠ΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, особСнно ΠΏΡ€ΠΈ использовании Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² forward. Если Π²Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ с этим ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом, Π²Ρ‹ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ компилятору ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° модуля. Однако, Ссли рСализация Ρ‚Π°ΠΊ ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π° ΠΊ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ компиляции модуля, Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½Π°Ρ ошибка. Бтрогая типизация языка Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сигнатуры объявлСния ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ совпадали ΠΏΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²ΠΎ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ Ρ‚ΠΈΠΏΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

πŸ“Š Как часто Π²Ρ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚Π΅ΡΡŒ с ошибками Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ?
Π•ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ
Раз в нСдСлю
Π Π΅Π΄ΠΊΠΎ
Волько ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ‡ΡƒΠΆΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ

Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ данная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ ограничиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стандартными ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ. Она Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ касаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² классов, особСнно Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈ динамичСских. Когда класс ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π½ΠΎ Π½Π΅ прСдоставляСт Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (ΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ родитСля), это Ρ‚Π°ΠΊΠΆΠ΅ классифицируСтся ΠΊΠ°ΠΊ unsatisfied declaration. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Delphi Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ трСбования Π½Π° наслСдованиС, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π΅Π΄Π΅Ρ‚ ΠΊ слоТным для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ситуациям.

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ возникновСния ошибки

БущСствуСт нСсколько классичСских сцСнариСв, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ ΠΊ появлСнию этой ошибки Π² Π»ΠΎΠ³Π΅ компилятора. Π§Π°Ρ‰Π΅ всСго ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° банальна: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ объявил ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΉ части, Π½ΠΎ Π·Π°Π±Ρ‹Π» Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π΅ ΠΊΠΎΠ΄Π°, ΠΊΠΎΠ³Π΄Π° сигнатура ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π±Ρ‹Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π°, Π° староС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ, ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Π’ Ρ‚Π°ΠΊΠΈΡ… случаях компилятор Π²ΠΈΠ΄ΠΈΡ‚ "Π΄Ρ‹Ρ€Ρƒ" Π² Π»ΠΎΠ³ΠΈΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π”Ρ€ΡƒΠ³ΠΎΠΉ распространСнной ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ являСтся нСсовпадСниС списков ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π”Π°ΠΆΠ΅ Ссли ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ, ΠΈΡ… Ρ‚ΠΈΠΏΡ‹ ΠΈ порядок Π΄ΠΎΠ»ΠΆΠ½Ρ‹ строго ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ объявлСнию. Если Π² интСрфСйсС Π²Ρ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠ°ΠΊ const String, Π° Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ написали просто String, компилятор посчитаСт это двумя Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ функциями. РСализация Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ Π½ΠΎΠ²ΠΎΠΉ, локальной ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ, Π° объявлСнная Π² интСрфСйсС останСтся Π±Π΅Π· Ρ‚Π΅Π»Π°. БинтаксичСский Π°Π½Π°Π»ΠΈΠ· Π½Π΅ ΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΡ… нСсоотвСтствий.

  • πŸ”΄ Забытая рСализация: ΠΌΠ΅Ρ‚ΠΎΠ΄ объявлСн Π² interface, Π½ΠΎ отсутствуСт Π² implementation.
  • πŸ”΄ НСсовпадСниС сигнатур: Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π² объявлСнии ΠΈ Ρ‚Π΅Π»Π΅.
  • πŸ”΄ Ошибки Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²: Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ использованиС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов virtual, override ΠΈΠ»ΠΈ forward.
  • πŸ”΄ ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с условной компиляциСй: рСализация скрыта Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ {$IFDEF}, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹.

ОсобоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ стоит ΡƒΠ΄Π΅Π»ΠΈΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌ условной компиляции. Часто Π±Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ макроса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборки. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния компилятора, функция Π±Ρ‹Π»Π° объявлСна, Π½ΠΎ Π΅Ρ‘ ΠΊΠΎΠ΄ Π±Ρ‹Π» ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΈΠ· сборки, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ. Π­Ρ‚ΠΎ особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с кроссплатформСнными ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ FireMonkey, Π³Π΄Π΅ ΠΊΠΎΠ΄ для Windows ΠΈ macOS ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠŸΡ€ΠΈ использовании условной компиляции всСгда провСряйтС, Ρ‡Ρ‚ΠΎ всС Π²Π΅Ρ‚Π²ΠΈ ΠΊΠΎΠ΄Π° содСрТат Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΈΠ½Π°Ρ‡Π΅ сборка для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΡƒΠΏΠ°Π΄Π΅Ρ‚.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ классов ΠΈ наслСдованиСм

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

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ нюанс связан с ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ override, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ классС этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сущСствуСт ΠΈ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ virtual ΠΈΠ»ΠΈ dynamic. Ошибка ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ, Ссли Π²Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ родитСля класса, Π½ΠΎ Π·Π°Π±Ρ‹Π»ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ класса. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΈ, Π½Π΅ найдя Π΅Ρ‘, выдаст сообщСниС ΠΎΠ± ошибкС. НаслСдованиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ согласованным Π²ΠΎ всСх Π·Π²Π΅Π½ΡŒΡΡ… Ρ†Π΅ΠΏΠΈ.

Рассмотрим Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ распространСнныС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΈ ΠΈΡ… влияниС Π½Π° Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ВрСбуСтся рСализация Π² классС ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ абстрактным Риск ошибки
Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Π”Π°, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ НСт Высокий
Virtual Π”Π°, Ссли класс Π½Π΅ абстрактный Π”Π° (с abstract) Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ
Override Π”Π°, Π·Π°ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ родитСля НСт Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ
External НСт (Π² DLL) НСт Низкий (Ссли DLL Π΅ΡΡ‚ΡŒ)

Бинтаксис TMyClass.MyMethod обязатСлСн. Если Π²Ρ‹ Π·Π°Π±ΡƒΠ΄Π΅Ρ‚Π΅ прСфикс класса, компилятор Ρ€Π΅ΡˆΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ объявили Π½ΠΎΠ²ΡƒΡŽ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, оставив ΠΌΠ΅Ρ‚ΠΎΠ΄ класса Π±Π΅Π· Ρ‚Π΅Π»Π°. Π­Ρ‚ΠΎ классичСская ошибка Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ², которая Π»Π΅Π³ΠΊΠΎ лСчится Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΊ дСталям.

Ошибки ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с внСшними Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ

ИспользованиС сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ DLL β€” Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π³Π΄Π΅ часто всплываСт unsatisfied forward declaration. Когда Π²Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· внСшнСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ external, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ имя экспорта ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. Если имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² DLL отличаСтся ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ Π² вашСм ΠΊΠΎΠ΄Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·-Π·Π° дСкорирования ΠΈΠΌΠ΅Π½ Π² C++), Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ Π½Π΅ смоТСт Π½Π°ΠΉΡ‚ΠΈ символ. ДинамичСская Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ точности Π² ΠΈΠΌΠ΅Π½Π°Ρ….

Часто ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° кроСтся Π² ΠΏΡƒΡ‚ΠΈ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ»ΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сама DLL Π½Π΅ содСрТит Π½ΡƒΠΆΠ½ΠΎΠΉ экспортной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ статичСских Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ошибки с внСшними зависимостями ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ компиляции, Π½ΠΎ ΠΈ ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Однако, Ссли Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ (.lib ΠΈΠ»ΠΈ.a) Π½Π° этапС сборки, ΠΎΠ½ сразу выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΎ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰Π΅ΠΌ символС. БтатичСская Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ° Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π° ΠΊ Π½Π°Π»ΠΈΡ‡ΠΈΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ компиляции.

  • πŸ”΅ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ имя экспортируСмой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (рСгистр Π±ΡƒΠΊΠ² ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅).
  • πŸ”΅ Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡƒΡ‚ΡŒ ΠΊ DLL ΡƒΠΊΠ°Π·Π°Π½ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ» находится Π² PATH.
  • πŸ”΅ Для C++ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ name для указания Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ экспорта.

Π’Π°ΠΊΠΆΠ΅ стоит ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠΉ совмСстимости. Если Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ 64-Π±ΠΈΡ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, всС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ статичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚ΠΎΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ 64-Π±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ 32-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² 64-Π±ΠΈΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π·Π° missing declaration, хотя Π½Π° самом Π΄Π΅Π»Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² нСсовмСстимы. АрхитСктура процСссора Π΄ΠΈΠΊΡ‚ΡƒΠ΅Ρ‚ свои ΠΏΡ€Π°Π²ΠΈΠ»Π° Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ совмСстимости.

ВлияниС условной компиляции ΠΈ макросов

Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ часто ΠΈΠ·ΠΎΠ±ΠΈΠ»ΡƒΡŽΡ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ {$IFDEF}, {$IFNDEF} ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ конструкциями прСпроцСссора. Π­Ρ‚ΠΎ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для управлСния ΠΊΠΎΠ΄ΠΎΠΌ, Π½ΠΎ ΠΎΠ½ ΠΆΠ΅ являСтся частым источником ошибок Ρ‚ΠΈΠΏΠ° unsatisfied forward. Если Π²Ρ‹ объявили ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² интСрфСйсС Π±Π΅Π· условий, Π½ΠΎ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ±Π΅Ρ€Π½ΡƒΠ»ΠΈ Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ макроса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, ΠΌΠ΅Ρ‚ΠΎΠ΄ останСтся Π±Π΅Π· Ρ‚Π΅Π»Π°. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ просто "Π²Ρ‹Ρ€Π΅ΠΆΠ΅Ρ‚" кусок ΠΊΠΎΠ΄Π°, считая Π΅Π³ΠΎ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ.

ОсобСнно остороТно Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎ-зависимым ΠΊΠΎΠ΄ΠΎΠΌ. НапримСр, ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ объявлСн для всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ, Π½ΠΎ рСализация написана Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Windows. ΠŸΡ€ΠΈ компиляции ΠΏΠΎΠ΄ Linux ΠΈΠ»ΠΈ macOS Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ. РСшСниС Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² создании Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ (dummy implementations) для unsupported ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ ΠΈΠ»ΠΈ использовании условий компиляции Π² самом объявлСнии интСрфСйса. ΠšΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ планирования структуры ΠΊΠΎΠ΄Π°.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ВсСгда провСряйтС Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ макросы Π² опциях ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (Project Options β†’ Delphi Compiler β†’ Conditional defines), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² сборку.

β˜‘οΈ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° условной компиляции

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ: 0 / 4

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹ΠΉ камСнь β€” это ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ макросов Π² Ρ€Π°Π·Π½Ρ‹Ρ… модулях. Если Π² ΠΎΠ΄Π½ΠΎΠΌ ΡŽΠ½ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ символ DEBUG_MODE, Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π½Π΅Ρ‚, Ρ‚ΠΎ рСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, зависящая ΠΎΡ‚ этого символа, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ собрана Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ рассинхронизации. Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ настроСк компиляции критичСски Π²Π°ΠΆΠ½Π° для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ диагностики ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ

Когда Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с ошибкой, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ шагом Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ сообщСния компилятора. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ IDE подсвСчиваСт строку с объявлСниСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Однако, Ссли ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΎ, поиск ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ‚ΡΠ½ΡƒΡ‚ΡŒΡΡ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ поиск ΠΏΠΎ всСму ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ (Ctrl+Shift+F) для нахоТдСния всСх ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠΉ ΠΈΠΌΠ΅Π½ΠΈ problematic Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π³Π΄Π΅ ΠΎΠ½Π° объявлСна ΠΈ Π³Π΄Π΅ (Π½Π΅) Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π΅Π½Π°. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ поиска Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΡΡŽΡ‚ диагностику.

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠΌ являСтся постСпСнноС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ частСй ΠΊΠΎΠ΄Π°. Если ошибка появилась послС добавлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ модуля, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² uses. Если ошибка исчСзла, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚ΠΎΡ‡Π½ΠΎ Π² этом ΠΌΠΎΠ΄ΡƒΠ»Π΅. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ‚Π΅Π»ΠΎ ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, измСнится Π»ΠΈ сообщСниС ΠΎΠ± ошибкС. ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ позволяСт Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ источник ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΎ Π»ΠΎΠ³Π°Ρ… компиляции. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ (Verbose linking) Π² настройках, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ тСряСт символ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ подсказку, Ссли ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° связана с порядком ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈΠ»ΠΈ с ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. ДСтализация Π»ΠΎΠ³ΠΎΠ² часто содСрТит ΠΊΠ»ΡŽΡ‡ ΠΊ Ρ€Π°Π·Π³Π°Π΄ΠΊΠ΅.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ риск появлСния Ρ‚Π°ΠΊΠΈΡ… ошибок Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, слСдуСт ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ» написания ΠΊΠΎΠ΄Π°. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, всСгда ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° сразу послС Π΅Π³ΠΎ объявлСния, особСнно Π² интСрфСйсах. НС ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΠΉΡ‚Π΅ Π½Π° ΠΏΠΎΡ‚ΠΎΠΌ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅Π» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ возмоТности IDE для Π°Π²Ρ‚ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°: ΠΊΠ»ΠΈΠΊ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ класса ΠΈ Π²Ρ‹Π±ΠΎΡ€ "Implement Interface" создаст Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ для всСх ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² автоматичСски. Автоматизация сниТаСт риск чСловСчСской ошибки.

РСгулярно ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ удаляйтС Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄. Если ΠΌΠ΅Ρ‚ΠΎΠ΄ большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½, удаляйтС Π΅Π³ΠΎ ΠΈ ΠΈΠ· интСрфСйса, ΠΈ ΠΈΠ· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠžΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ "висячиС" объявлСния β€” прямой ΠΏΡƒΡ‚ΡŒ ΠΊ ошибкам Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ статичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… Π±Π΅Π· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅Ρ‰Π΅ Π΄ΠΎ этапа компиляции. ΠŸΡ€ΠΎΠ°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ экономит врСмя.

  • 🟒 Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Π²Ρ‚ΠΎ-Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· контСкстноС мСню IDE.
  • 🟒 Π‘Ρ€Π°Π·Ρƒ удаляйтС объявлСния ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ большС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.
  • 🟒 ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠΉΡ‚Π΅ соотвСтствиС сигнатур ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².
  • 🟒 ВСстируйтС сборку ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… конфигурациях (Debug/Release, 32/64 bit).

БоблюдСниС этих простых ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π² чистотС ΠΈ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ frustrating ошибок компиляции. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ компилятор Delphi β€” строгий, Π½ΠΎ чСстный инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° логичСскиС нСстыковки Π² вашСм ΠΊΠΎΠ΄Π΅. Дисциплина ΠΊΠΎΠ΄Π° β€” Π·Π°Π»ΠΎΠ³ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли рСализация Π΅ΡΡ‚ΡŒ, Π½ΠΎ ошибка остаСтся?

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Π½Π΅ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° Π»ΠΈ рСализация случайно, ΠΈΠ»ΠΈ Π½Π΅ скрыта Π»ΠΈ ΠΎΠ½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ условной компиляции. Π’Π°ΠΊΠΆΠ΅ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ компилируСтся.

ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ эта ошибка Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° вирусом Π² систСмС?

ΠšΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅Π΄ΠΊΠΎ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это ошибка Π² ΠΊΠΎΠ΄Π΅. Однако, Ссли антивирус Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ доступ компилятора ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΈΠ»ΠΈ DLL, это ΠΌΠΎΠΆΠ΅Ρ‚ тСорСтичСски привСсти ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ.

Как быстро Π½Π°ΠΉΡ‚ΠΈ всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±Π΅Π· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ встроСнный инспСктор ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ сторонниС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ для статичСского Π°Π½Π°Π»ΠΈΠ·Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΌΠ΅ΡŽΡ‚ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ declared but not implemented ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².