Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора

Π£Ρ€ΠΎΠΊ3. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора C++

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссораВ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΏΠΎΡΡ‚ΠΈΠ³Π°Ρ‚ΡŒ искусство программирования Π½Π° языкС Π‘++. На этом этапС обучСния ΠΏΠΎΡ€Π° познакомится с Ρ‚Π°ΠΊΠΈΠΌΠΈ Π²Π΅Ρ‰Π°ΠΌΠΈ, ΠΊΠ°ΠΊ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора. ЗабСгая Π½Π°ΠΏΠ΅Ρ€Π΅Π΄ скаТу, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΡƒΡ€ΠΎΠΊΠ°Ρ… ΠΌΡ‹ ΡƒΠΆΠ΅ использовали Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #include, которая слуТит для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

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

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора

Как Π²ΠΈΠ΄Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ самой компиляциСй исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ прСпроцСссор, Π΄Π°Π²Π°ΠΉΡ‚Π΅ познакомимся с Π΅Π³ΠΎ инструкциями ΠΏΠΎΠ±Π»ΠΈΠΆΠ΅.

К основным Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌ прСпроцСссора C++ относятся:

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #include

НачнСм с Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #include, которая замСняСтся прСпроцСссором Π½Π° содСрТимоС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π½Π΅ΠΉ Ρ„Π°ΠΉΠ»Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования #include:

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

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #ifdef ΠΈ #define

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #ifndef выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π½Π΅ Π±Ρ‹Π»Π° Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° константа CUCUMBLER_H Ρ€Π°Π½Π΅Π΅, ΠΈ Ссли ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, Ρ‚ΠΎ выполняСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ константы, ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт Π΄ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #endif. Как Π½Π΅ слоТно Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #define опрСдСляСт константу CUCUMBLER_H. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ кусок ΠΊΠΎΠ΄Π° ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠΎΠ΄Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ проинициализируСтся константа CUCUMBLER_H ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ #ifndef CUCUMBLER_H Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ FALSE.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #define ΡˆΠΈΡ€ΠΎΠΊΠΎ примСняСтся ΠΈ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Если константа IN_DEBUG Π½Π΅ Π·Π°Π΄Π°Π½Π°, Ρ‚ΠΎ прСпроцСссор сгСнСрируСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ исходник:

Но Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ IN_DEBUG, Ρ‚ΠΎ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ помСняСтся

Π—Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΡƒΡŽ константу ΠΌΠΎΠΆΠ½ΠΎ прямо ΠΈΠ· консоли. НапримСр для компилятора g++ примСняСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° прСпроцСссора #line

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #error

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° позволяСт ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ процСсс процСсс компиляции. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π£Ρ€ΠΎΠΊ β„–22. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора

Обновл. 11 БСн 2021 |

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

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #include

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

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #include ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ Ρ„ΠΎΡ€ΠΌΡ‹:

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #define

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #define ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания макросов. ΠœΠ°ΠΊΡ€ΠΎΡ β€” это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ опрСдСляСт ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡŽ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

Π•ΡΡ‚ΡŒ Π΄Π²Π° основных Ρ‚ΠΈΠΏΠ° макросов: макросы-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ макросы-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

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

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… способов:

#define ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ тСкст_Π·Π°ΠΌΠ΅Π½Π°

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с тСкст_Π·Π°ΠΌΠ΅Π½Π°

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора C#

Π₯отя Ρƒ компилятора Π½Π΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ прСпроцСссора, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, описанныС Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ Π±Ρ‹Π». Они ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² условной компиляции. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² C ΠΈ C++ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для создания макросов. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° прСпроцСссора Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ СдинствСнной инструкциСй Π² строкС.

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° прСпроцСссора #nullable устанавливаСт контСкст с Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ ΠΎ допустимости Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ NULL ΠΈ контСкст с прСдупрСТдСниями ΠΎ допустимости Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ NULL. Π­Ρ‚Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° опрСдСляСт, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL, ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π»ΠΈ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ прСдупрСТдСния ΠΎ допустимости Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ NULL. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ контСкст Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½, Π»ΠΈΠ±ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½.

Оба контСкста ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ исходного ΠΊΠΎΠ΄Π° C#). Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #nullable управляСт контСкстами Π·Π°ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ уровня ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π·Π°Π΄Π°Π΅Ρ‚ контСксты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ управляСт, ΠΏΠΎΠΊΠ° другая Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ Π΅Π΅, ΠΈΠ»ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° исходного Ρ„Π°ΠΉΠ»Π°.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ использования Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²:

Условная компиляция

Для управлСния условной компиляциСй ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора.

Для Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚ SDK, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ символы условной компиляции для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ Π² Visual Studio с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ страниц свойств ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ для использования Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹Ρ… интСрфСйсов API, ΠΊΠΎΠ³Π΄Π° это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ:

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ символов

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ символов для условной компиляции.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #define нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для объявлСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ констант, ΠΊΠ°ΠΊ это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ дСлаСтся Π² C ΠΈ C++. Для опрСдСлСния констант Π² C# слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ статичСскиС элСмСнты класса ΠΈΠ»ΠΈ структуры. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… констант ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ для Π½ΠΈΡ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс «Constants».

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ областСй

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ области ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π² структуру, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #region позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ структурирования Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΠΊΠΎΠ΄Π°. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΊΠΎΠ΄Π° ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΈΠ»ΠΈ нСсколько, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΎΡ‚Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚ΠΎΠΉ части Ρ„Π°ΠΉΠ»Π°, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² настоящСС врСмя ΠΈΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ:

БвСдСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΈ прСдупрСТдСниях

Π’Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ компилятору ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ошибки ΠΈ прСдупрСТдСния компилятора, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ свСдСниями ΠΎ строках с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ².

#error позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ CS1029 ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ мСста Π² ΠΊΠΎΠ΄Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ #error version особым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈ сообщаСт ΠΎΠ± ошибкС компилятора CS8304 с сообщСниСм, содСрТащим ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ вСрсии компилятора ΠΈ языка.

#warning позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ компилятора CS1030 ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ уровня ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ мСста Π² ΠΊΠΎΠ΄Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #line позволяСт ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ строки компилятора ΠΈ ΠΏΡ€ΠΈ нСобходимости имя Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ошибки ΠΈ прСдупрСТдСния.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΎΡ‚Ρ‡Π΅Ρ‚ Π΄Π²Π° прСдупрСТдСния, связанныС с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ строк. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #line 200 ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ устанавливаСт Π½ΠΎΠΌΠ΅Ρ€ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строки 200 (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½ΠΎΠΌΠ΅Ρ€ 6). Π”ΠΎ выполнСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #line Π² ΠΎΡ‚Ρ‡Π΅Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ имя Ρ„Π°ΠΉΠ»Π° Special. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #line default ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ восстанавливаСт Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΡŽ строк Π² исходноС состояниС с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ строк, Π½ΠΎΠΌΠ΅Ρ€Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ компиляции Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #line hidden скрываСт ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки для ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°. Π’ этом случаС ΠΏΡ€ΠΈ пошаговой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΊΠΎΠ΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ всС строки ΠΌΠ΅ΠΆΠ΄Ρƒ #line hidden ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #line (ΠΊΡ€ΠΎΠΌΠ΅ случаСв, ΠΊΠΎΠ³Π΄Π° это Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #line hidden ) Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹. Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ ASP.NET Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ опрСдСляСмый ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ создаваСмый ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ ΠΊΠΎΠ΄. Π’ основном эта функция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ASP.NET, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… исходного ΠΊΠΎΠ΄Π°.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #line hidden Π½Π΅ влияСт Π½Π° ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° строк Π² ΠΎΡ‚Ρ‡Π΅Ρ‚Π°Ρ… ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ошибки Π² скрытом Π±Π»ΠΎΠΊΠ΅ компилятор ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ Π² ΠΎΡ‚Ρ‡Π΅Ρ‚Π΅ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ имя Ρ„Π°ΠΉΠ»Π° ΠΈ Π½ΠΎΠΌΠ΅Ρ€ строки, Π³Π΄Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π° ошибка.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #line filename Π·Π°Π΄Π°Π΅Ρ‚ имя Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… компилятора. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ фактичСскоС имя Ρ„Π°ΠΉΠ»Π° с исходным ΠΊΠΎΠ΄ΠΎΠΌ. Имя Ρ„Π°ΠΉΠ»Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ (» «). ΠŸΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½ΠΎΠΌΠ΅Ρ€ строки.

Начиная с C# 10 ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #line :

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ этой Ρ„ΠΎΡ€ΠΌΡ‹:

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΡƒΠ΄Π΅Ρ‚ создано ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅:

ПослС ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ сопоставлСния пСрСмСнная b находится Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС, Π² ΡˆΠ΅ΡΡ‚ΠΎΠΌ символС.

ΠŸΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки (DSL) ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ этот Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивноС сопоставлСниС исходного Ρ„Π°ΠΉΠ»Π° с созданными Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ C#. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ этого Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π² спСцификации Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ pragma

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #pragma прСдоставляСт компилятору ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ инструкции для компиляции Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½Π° появляСтся. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ эти инструкции. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #pragma Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания настраиваСмых инструкций ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

pragma-name β€” имя распознанной ΠΏΡ€Π°Π³ΠΌΡ‹, Π° pragma-arguments β€” Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, относящиСся ΠΊ ΠΏΡ€Π°Π³ΠΌΠ΅.

#pragma warning

#pragma warning ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ прСдупрСТдСния.

warning-list β€” список Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ с Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ-запятой. ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ CS являСтся Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Если Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹, disable ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всС прСдупрСТдСния, Π° restore Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всС прСдупрСТдСния.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Π² Visual Studio, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ сборку ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° Π·Π°Ρ‚Π΅ΠΌ поиск Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Π² ΠΎΠΊΠ½Π΅ Π’Ρ‹Π²ΠΎΠ΄.

#pragma checksum

Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы для исходных Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ с ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ страниц ASP.NET.

«filename» β€” это имя Ρ„Π°ΠΉΠ»Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ трСбуСтся наблюдСниС Π·Π° измСнСниями ΠΈΠ»ΠΈ обновлСниями, «» β€” Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ (GUID) для Ρ…ΡΡˆ-Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, Π° «checksum_bytes» β€” строка ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Ρ†ΠΈΡ„Ρ€, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π±Π°ΠΉΡ‚Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы. Π”ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ числом ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Ρ†ΠΈΡ„Ρ€. НСчСтноС число Ρ†ΠΈΡ„Ρ€ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ прСдупрСТдСния Π²ΠΎ врСмя компиляции, ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π°.

ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Visual Studio ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ источника. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ вычисляСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму для исходного Ρ„Π°ΠΉΠ»Π°, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Ρ„Π°ΠΉΠ» Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (PDB) ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ PDB-Ρ„Π°ΠΉΠ» для сравнСния с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммой, вычислСнной ΠΈΠΌ для исходного Ρ„Π°ΠΉΠ»Π°.

Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ASP.NET, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ рассчитанная ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма относится ΠΊ созданному исходному Ρ„Π°ΠΉΠ»Ρƒ, Π° Π½Π΅ Ρ„Π°ΠΉΠ»Ρƒ ASPX. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, #pragma checksum прСдоставляСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм для страниц ASP.NET.

ΠŸΡ€ΠΈ создании ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ASP.NET Π² Visual C# созданный исходный Ρ„Π°ΠΉΠ» содСрТит ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму для ASPX-Ρ„Π°ΠΉΠ»Π°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ создаСтся источник. Π—Π°Ρ‚Π΅ΠΌ компилятор записываСт эти Π΄Π°Π½Π½Ρ‹Π΅ Π² PDB-Ρ„Π°ΠΉΠ».

Если компилятор Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #pragma checksum Π² Ρ„Π°ΠΉΠ»Π΅, ΠΎΠ½ вычисляСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму ΠΈ записываСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² PDB-Ρ„Π°ΠΉΠ».

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ C

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° процСссора

Π‘ΠΈ прСпроцСссор прСдставляСт собой ΠΌΠ°ΠΊΡ€ΠΎ язык, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСобразования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ скомпилирована. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ сама ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° Π‘ΠΈ, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π° Π‘++, Objective-C ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π° ассСмблСрС. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ прСпроцСссор прСдставляСт собой ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠ°ΠΊ-Π±Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ язык, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΏΠΎΠ»Π½Π΅ интСрСсныС Π²Π΅Ρ‰ΠΈ.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ прСпроцСссор.

Для понимания Ρ€Π°Π±ΠΎΡ‚Ρ‹ прСпроцСссора Π²Π°ΠΆΠ½ΠΎ ΠΎΡΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракций с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ понятиСм Π² прСпроцСссорС являСтся Ρ‚ΠΎΠΊΠ΅Π½ (token) β€” это, Π³Ρ€ΡƒΠ±ΠΎ говоря ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов, отдСлённая раздСлитСлями, ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π² Π‘ΠΈ, Π½ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡˆΠΈΡ€Π΅. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ Π² прСпроцСссорС Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, строковыС ΠΈ числовыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΈ выраТСния, Π΅Ρ‰Π΅ ΠΎΠ½ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ (просто ΠΈΡ… ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚). Π£ΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎ говоря, прСпроцСссор Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с тСкстовыми строчками, ΡƒΠΌΠ΅Π΅Ρ‚ ΠΈΡ… ΡΠΊΠ»Π΅ΠΈΠ²Π°Ρ‚ΡŒ, ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π² строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π», Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ макроподстановку, ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прСпроцСссор распознаёт ΠΈ выполняСт. ВсС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ со Π·Π½Π°ΠΊΠ° #. Если ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π½Π΅ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹ΠΉ символ Π² строкС это β€” #, Ρ‚ΠΎ прСпроцСссор Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Π² Π½Π΅ΠΉ свою Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ.
Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹:
β€” ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²: #include, #include_next.
β€” Условная компиляция: #if, #ifdef, #ifndef, #else, #elif and #endif.
β€” Диагностика: #error, #warning, #line.
β€” Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация компилятору: #pragma
β€” ΠœΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ: #define

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ².

ΠŸΠ΅Ρ€Π²Π°Ρ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°, которая всСм встрСчаСтся ΠΏΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ языка Π‘ΠΈ β€” это #include. ЗаписываСтся Ρ‚Π°ΠΊ:

ВстрСтив Π² исходникС эту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ, прСпроцСссор замСняСт Π΅Ρ‘ Π½Π° содСрТимоС Ρ„Π°ΠΉΠ»Π°, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠΎΠΉ записи состоит Π² Ρ‚ΠΎΠΌ, Π³Π΄Π΅ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, прСпроцСссор Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΎΠ½ сначала Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ… с систСмными Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ β€” Π² Ρ‚ΠΎΠΌ-ΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Π³Π΄Π΅ находится ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ исходник. Π“Ρ€ΡƒΠ±ΠΎ говоря, ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ систСмных/стандартных Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ имя Ρ„Π°ΠΉΠ»Π° ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках, Π° для своих β€” Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ….
Мало ΠΊΡ‚ΠΎ Π·Π½Π°Π΅Ρ‚, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ² β€” #include_next. ЗаписываСтся ΠΎΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ #include, Π½ΠΎ Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ нСсколько отличаСтся. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ прСпроцСссор ΠΈΡ‰Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΏΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ путям, ΠΈ Π±Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ искомый Ρ„Π°ΠΉΠ» Π΅ΡΡ‚ΡŒ сразу Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…. Π’ случаС примСнСния Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #include, ΠΎΠ½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ попавшийся Ρ„Π°ΠΉΠ» с совпавшим ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π’ случаС #include_next β€” Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с совпавшим ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Π΅ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π»ΡΡ Π² эту Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ трансляции, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π΅Ρ‰Π΅ Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ #include_next ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² этих самых Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ… с ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, примСнённая Π².с Ρ„Π°ΠΉΠ»Π΅ эта Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π²Π΅Π΄Ρ‘Ρ‚ сСбя ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ #include. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ #include_next, Ρ‚ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅, ΠΎΠ½ΠΈ всС Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹.
Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° интСрСсная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #include Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΉ Ρ‚ΠΎΠΆΠ΅ выполняСтся макроподстановка. Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Π½Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ развСрнётся Π² имя Ρ„Π°ΠΉΠ»Π° Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π΄Π²ΡƒΡ… допустимых Ρ„ΠΎΡ€ΠΌ(Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… ΠΈΠ»ΠΈ Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках). НапримСр:

Условная компиляция

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π² зависимости ΠΎΡ‚ значСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… макросов, Π½ΡƒΠΆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ кусок ΠΊΠΎΠ΄Π°, ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ макросы.

Π“Π΄Π΅ условиС β€” это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ прСпроцСссора. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любая комбинация макросов, условий ΠΈ цСлочислСнных Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ², которая Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ макроподстановки прСвратится Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ состоящСС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· цСлочислСнных Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ², арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ логичСских ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². Π’Π°ΠΊ-ΠΆΠ΅ здСсь Π΅Ρ‰Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ СдинствСнный Β«ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Β» β€” defined β€” ΠΎΠ½ прСвращаСтся Π² 1, Ссли Π΅Π³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½, ΠΈ 0 β€” Ссли Π½Π΅Ρ‚.

__AVR__ ΠΈ __ICCAVR__ β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ макросы, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ компилятор. БоотвСтствСнно для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ компилятора сущСствуСт ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π΅Π³ΠΎ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.
Как ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ, прСпроцСссор Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² β€” тСкстовых строчСк, ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСпроцСссору Π±Π΅Π·Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ, ΠΈ ΠΎΠ½ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… ΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ языка. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°Ρ… условной компиляции нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ конструкции языка Π‘ΠΈ. НапримСр:

Π’ ΠΎΠ±ΠΎΠΈΡ… ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… условия Π±ΡƒΠ΄ΡƒΡ‚ всСгда Π»ΠΎΠΆΠ½Ρ‹ ΠΈ содСрТимоС #if Π±Π»ΠΎΠΊΠΎΠ² Π½Π΅ выполнится. ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ Π½Π΅ Π·Π½Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ, Π½ΠΈ ΠΎ структурах ΠΈ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅, Π½ΠΈ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… β€” ΠΎΠ½ΠΈ-ΠΆ Π½Π΅ макросы. По этому Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ static_assert, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ срСдствами самого Π‘ΠΈ. А Π²ΠΎΡ‚ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ извСрнутся Ρ‚Π°ΠΊ:

Условия ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ слоТными ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² сСбС макросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π·Π²Ρ‘Ρ€Π½ΡƒΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ вычислСниСм условия:

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±Π»ΠΎΠΊ #if выполнится Ссли макрос BUFFER_SIZE ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ стСпСни Π΄Π²ΠΎΠΉΠΊΠΈ ΠΈ Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ макрос OPTIMIZE_FOR_POWER_OF_2. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ IS_POWER_OF_2(BUFFER_SIZE) послС макроподстановки развСрнСтся Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ((16) & (16)-1 == 0), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСпроцСссор Π»Π΅Π³ΠΊΠΎ вычислит.
Для конструкции Ρ‚ΠΈΠΏΠ° #if defined Π΅ΡΡ‚ΡŒ сокращСнная Ρ„ΠΎΡ€ΠΌΠ°: #ifdef. Она Π²ΠΎ всём эквивалСнтна ΠΏΠΎΠ»Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² сокращСнной Ρ„ΠΎΡ€ΠΌΠ΅ нСльзя ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСсколько условий.
Π’Π°ΠΊΠΆΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ условной компиляции часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для прСдотвращСния ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (include guard):

Π­Ρ‚Π° конструкция Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ всС опрСдСлСния ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ трансляции.

Диагностика.

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΠ»ΠΈΡΡŒ с ΠΎΠ΄Π½ΠΎΠΉ диагностичСской Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ β€” #error. НазначСниС Π΅Ρ‘ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ просто β€” ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ с сообщСниСм ΠΎΠ± ошибкС, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ послС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹. Π•Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ совмСстно с Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ условной компиляции для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ± ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ установлСн Π»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π²Π°ΠΆΠ½Ρ‹ΠΉ макрос ΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
Π’Π°ΠΊΠΆΠ΅ сущСствуСт Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #warning, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° #error, Π½ΠΎ Π½Π΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Π° Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.
Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #line слуТит для задания Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² строк ΠΈ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π² сообщСниях ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ макросами __LINE__ ΠΈ __FILE__. НапримСр:

ΠŸΡ€ΠΈ этом Π² сообщСниях ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ слСдущСС:

Надо ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ такая конструкция ΡΠΎΠ±ΡŒΡ‘Ρ‚ столку Π»ΡŽΠ±ΡƒΡŽ IDE (ΠΈ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° Ρ‚ΠΎΠΆΠ΅) ΠΈ Π½Π°ΠΉΡ‚ΠΈ мСсто ошибки Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ просто. Однако этот Ρ‚Ρ€ΡŽΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ± ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π²ΠΎΠ·Π½ΠΈΠΊΡˆΡƒΡŽ Π³Π΄Π΅-Ρ‚ΠΎ Π΄Π°Π»Π΅ΠΊΠΎ ΠΎΡ‚ мСста, Π³Π΄Π΅ ΠΌΡ‹ Π΅Π΅ провСряСм, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π²Π°ΠΆΠ½Ρ‹ΠΉ макрос, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΈ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Надо Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ Π³Π΄Π΅ ΠΎΠ½ располоТСн.

#pragma
ΠœΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ интСрСсному, собствСнно ΠΊ макросам. ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° макросов: макрос-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚(object-like macro) ΠΈ макрос-функция(function-like macro), ΠΎΠ±Π° Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #define. Рассмотрим сначала макросы-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ΠžΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ ΠΊΠ°ΠΊ:
#define ИМЯ_МАКРОБА [Π·Π°ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠΉ тСкст]
Всё, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Ρ‘Ρ‚ послС имя макроса Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки являСтся Π·Π°ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠΌ тСкстом.

ΠŸΡ€ΠΈ дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ„Π°ΠΉΠ»Π°, Ссли прСпроцСссор Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ имя макроса, ΠΎΠ½ замСняСт Π΅Π³ΠΎ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π·Π°ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠΉ тСкст β€” это называСтся макроподстановка. Если Π² Π·Π°ΠΌΠ΅Ρ‰Π°ΡŽΡ‰Π΅ΠΌ тСкстС макроса Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… макросов, прСпроцСссор Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ макроподстановку для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Π²Ρ‘Ρ€Π½ΡƒΡ‚Ρ‹ всС извСстныС Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ макросы.

Когда прСпроцСссор Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€aΠ±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ строчку:
char buffer[DOUBLE_BUFFER];
Π‘Π½Π°Ρ‡Π°Π»Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° пСрвая макроподстановка ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ DOUBLE_BUFFER Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° EXTRA_BUFFER * 2. Π’ΡƒΡ‚-ΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° вторая макроподстановка ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ EXTRA_BUFFER замСнСтся Π½Π° (BUFFER_SIZE +10), ΠΏΠΎΡ‚ΠΎΠΌ BUFFER_SIZE замСнСтся Π½Π° 32. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ вся строчка послС прСпроцСссинга Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π—Π΄Π΅ΡΡŒ становится понятно, Π·Π°Ρ‡Π΅ΠΌ Π±Ρ‹Π»ΠΈ Π½ΡƒΠΆΠ½Ρ‹ скобки Π² макросС EXTRA_BUFFER, Π±Π΅Π· Π½ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π±Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ:

А это явно Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ. ΠžΡ‚ΡΡŽΠ΄Π° ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ:
Если макрос содСрТит ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² скобки, ΠΈΠ½Π°Ρ‡Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ всякиС Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ.
Π’Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ прСпроцСссор сам Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ вычисляСт (ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ Π² условных Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°Ρ… #if), ΠΎΠ½ просто склСиваСт тСкстовыС строчки.
А Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ макрос Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ сам Π½Π° сСбя, нСпосрСдствСнно, ΠΈ косвСнно Ρ‡Π΅Ρ€Π΅Π· Π΄Ρ€ΡƒΠ³ΠΈΠ΅ макросы? НичСго Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, рСкурсии Π½Π΅ получится, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прСпроцСссор просСчСт Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ, ΠΎΠ½ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ макроподстановку макроса Π΅Ρ‘ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ ΠΈ оставит Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ. НапримСр:

ΠŸΡ€ΠΈ этом Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ ΠΈ символ прСпроцСссора flags ΠΈ пСрСмСнная flags. Ρ‚Π°ΠΊΡƒΡŽ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ(ΠΈΠ»ΠΈ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² условной компиляции #ifdef/#else/#endif:
// Ссли Ρ„Π»Π°Π³ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹

Π₯отя я Π±Ρ‹ Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΡ‘ΠΌ Π±Π΅Π· ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ нСобходимости, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ сильно затрудняСт ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Ρ‡Ρ€Π΅Π²Π°Ρ‚ ошибками, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΏΠΎ сути пишСм Π΄Π²Π΅ вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΎΠ΄Π½ΠΎΠΌ Π½Π°Π±ΠΎΡ€Π΅ исходников со всСми Π²Ρ‹Ρ‚Π΅ΠΊΠ°ΡŽΡ‰ΠΈΠΌΠΈ послСдствиями. Π’Π΅Π΄ΡŒ Π΅ΡΡ‚ΡŒ-ΠΆΠ΅ систСмы контроля вСрсий!

ΠŸΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ макросы

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ компилятора Π΅ΡΡ‚ΡŒ мноТСство ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… макросов, Π΅ΡΡ‚ΡŒ стандартныС β€” ΠΎΠ±Ρ‰ΠΈΠ΅ для всСх: gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html#Standard-Predefined-Macros
Π•ΡΡ‚ΡŒ спСцифичныС для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ компилятора, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρƒ gcc:
gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html#Common-Predefined-Macros
И Π΄Π°ΠΆΠ΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для avr-gcc, список всСх ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… макросов(ΠΊΡ€ΠΎΠΌΠ΅ контСкстно зависимых, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ __LINE__ ΠΈ Ρ‚.Π΄) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π°Π±Ρ€Π°Π² Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС:

БоотвСтствСнно, вмСсто atmega16 ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€.
Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… компиляторах ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ макросы ищутся Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.
ВсС эти макросы ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для опрСдСлСния ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ компилируСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ языка (Π‘ΠΈ, Π‘ΠΈ++ ΠΈΠ»ΠΈ ассСмблСр) ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… особСнностСй Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹.
Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ макросы ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ Π² основном для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ: __FILE__, __LINE__ ΠΈ __FUNCTION__. __FILE__ разворачиваСтся Π² строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π», содСрТащий имя ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. __LINE__ β€” цСлочислСнный Π»ΠΈΡ‚Π΅Ρ€Π°Π» ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки. __FUNCTION__ β€” имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Надо Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ макрос __FUNCTION__ разворачиваСтся всё-Ρ‚Π°ΠΊΠΈ Π½Π΅ прСпроцСссором Π° компилятором β€” прСпроцСссор Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ функциях Π² языкС Π‘ΠΈ. Π’Π°ΠΊΠΆΠ΅ Π½Π°Π΄ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ значСния __LINE__ ΠΈ __FILE__ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #line.
Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ использованиС макросов __LINE__, __FILE__ ΠΈ __FUNCTION__:

ΠŸΡ€ΠΈ этом Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MyError прСвратится Π²ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅:

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²ΠΈΠ΄ макросов β€” это ΠΌΠ°ΠΊΡ€ΠΎ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (function-like macros). ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΎΠΉ-ΠΆΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #define, послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ (сразу Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²) Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках ΠΈΠ΄Ρ‘Ρ‚ список Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… запятыми Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

ΠœΠ°ΠΊΡ€ΠΎΡ SQR ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΅ΠΌΡƒ выраТСния, Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ SQR(b) развСрнётся Π² (b * b). Π’Ρ€ΠΎΠ΄Π΅-Π±Ρ‹ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π½ΠΎ Ссли этому макросу ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
,
Ρ‚ΠΎ ΠΎΠ½ развСрнётся совсСм Π½Π΅ Π² Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ:

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ выполнится ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈ это Ρƒ нас ΡƒΠΆΠ΅ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚.
ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ макросов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² матСматичСских ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ выраТСниях Π½Π°Π΄ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² скобки:

Однако ΠΈ этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π΅ свободСн ΠΎΡ‚ нСдостатков, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ b Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° Π΄Π²Π° Ρ€Π°Π·Π°. И Ρƒ этого нСдостатка Π΅ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΈ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ, стандартныС ΠΈ Π½Π΅Ρ‚, Π½ΠΎ ΠΎ Π½ΠΈΡ… Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ (inline) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ½Π° свободна ΠΎΡ‚ нСдостатков макросов:

Π£ макросов-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΅ΡΡ‚ΡŒ интСрСсная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ β€” макроподстановка Π² Π½ΠΈΡ… выполняСтся Π΄Π²Π° Ρ€Π°Π·Π°. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· β€” для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ подставлСны Π² Ρ‚Π΅Π»ΠΎ макроса. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· β€” для всСго Ρ‚Π΅Π»Π° макроса послС подстановки Π² Π½Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ особого значСния. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этом ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ здСсь:
gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan

Π’ ΠΌΠ°ΠΊΡ€ΠΎ-функциях ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΠΊΡ€ΠΎ-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°: # ΠΈ ##. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ свой ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π² строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π»:

Π’Ρ‹Π·ΠΎΠ² PRINT_VAR Π² Π΄Π°Π½Π½ΠΎΠΌ случаС прСвратится Π²

ΠŸΡ€ΠΈ этом Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Π° строка: my_var = 10. Π—Π΄Π΅ΡΡŒ для склСивания Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π½ΠΎΠΉ строки использован Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ строки Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ лишь ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ символами компилятор считаСт ΠΎΠ΄Π½ΠΎΠΉ строкой: «%s = %» Β«dΒ».
ΠœΠ°ΠΊΡ€ΠΎ-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ## склСиваСт Π΄Π²Π° Ρ‚ΠΎΠΊΠ΅Π½Π° Π² ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΎΠΊΠ΅Π½, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ послС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° макроподстановка:

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ эти ΠΌΠ°ΠΊΡ€ΠΎ-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ макросов. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ макроподстановка Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· β€” для ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ PORT_LETTER Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π² Π½Π΅ΠΌ макросов. ΠŸΠΎΡ‡Π΅ΠΌΡƒ макрос SET_PIN состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π½ΠΈΠΆΠ΅.
Π’Π΅ΠΏΠ΅Ρ€ΡŒ, допустим, Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ склСиваСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΠ· Π΄Π²ΡƒΡ… кусков:

Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° этого макроса нСпосрСдствСнно, Ρ‚Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠ»Π΅ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅, Ρ‚ΠΎ всё сработаСт ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ. Если-ΠΆΠ΅ это макросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сначала Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ, Ρ‚ΠΎ придСтся Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сначала Ρ€Π°Π·Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ пСрСдаст ΠΈΡ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ макросу:

Из-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° конкатСнация, Π½Π΅ производится макроподстановка, Π² прСпроцСссорном ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ часто приходится ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π²ΡƒΡ…ΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ макросы: ΠΎΠ΄ΠΈΠ½ β€” для развёртывания ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠœΠ°ΠΊΡ€ΠΎ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ имя Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ°ΠΊΡ€ΠΎ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ, соотвСтствСнно, Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Ρ‘:

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прСпроцСссорного мСтапрограммирования

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ для вычислСния ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы CRC16. Ѐункция для вычислСния CRC16 для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° выглядит Ρ‚Π°ΠΊ:

Π“Π΄Π΅ newchar β€” ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Π±Π°ΠΉΡ‚ сообщСния для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ вычисляСм CRC,
crcval β€” ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ CRC.
сrcTable β€” Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠ· 256 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.
Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы.

ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ идСя Π±Ρ‹Π»Π° ΠΈ вовсС Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ CRC16 ΠΎΡ‚ строкового Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСпроцСссора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ Β«switchΒ» ΠΏΠΎ CRC16 ΠΎΡ‚ строки, с ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ. Но Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° прСпроцСссорС это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΈΠ·-Π·Π° стСпСнной слоТности Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ β€” компилятору банально Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ памяти, Ρ‡Ρ‚ΠΎΠ± ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ CRC16 для Π΄Π²ΡƒΡ… символов. На ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… Π‘++ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π•Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ сrcTable ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π“Π΄Π΅ v β€” индСкс Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅,
polynom β€” ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы, Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0x8408, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ стандарту CRC-CCITT.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ этот Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСпроцСссора. Как Π±Ρ‹Ρ‚ΡŒ с Ρ†ΠΈΠΊΠ»ΠΎΠΌ? Π’ прСпроцСссорС Π½Π΅Ρ‚ Π½ΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ² Π½ΠΈ рСкурсии. ΠŸΡ€ΠΈΠΉΠ΄Ρ‘Ρ‚ΡΡ Ρ†ΠΈΠΊΠ» Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, вызывая макрос CRC_TABLE_8 ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ это, кстати, ΠΎΡ‡Π΅Π½ΡŒ Π΄Π»ΠΈΠ½Π½ΠΎΠ΅ порядка 200-400 тысяч символов! Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ(ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ) макрос CRC_TABLE_x Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ 3 макроса Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ уровня, Π° вСдь прСпроцСссор сам выраТСния Π½Π΅ вычисляСт, оставляя это компилятору. И получаСтся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΄Π»ΠΈΠ½Π½Π° Ρ‚Π°ΠΊΠΎΠ³ΠΎ выраТСния порядка 3 Π² восьмой стСпСни ΠΏΠΎΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Π΄Π»ΠΈΠ½Π½Ρ‹ выраТСния низшСго уровня. Но Π½ΠΈΡ‡Π΅Π³ΠΎ, это компилятор Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΠΆΠ΅Π²Ρ‹Π²Π°Π΅Ρ‚. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ саму Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:
#define CRC_POLYNOM 0x8408

МоТно, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈ Ρ‚Π°ΠΊ, Π½ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΡˆΠ΅, называСтся β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Boost preprocessor. Π’ Π½Π΅ΠΉ имССтся ΠΌΠ½ΠΎΠ³ΠΎ всяких полСзняшСк, Π² частности Π΅ΡΡ‚ΡŒ макрос BOOST_PP_REPEAT, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ повторяСт Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ количСство Ρ€Π°Π· макрос, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅ΠΌΡƒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π‘ использованиСм BOOST_PP_REPEAT Π³Π΅Π΅Ρ€Π°Ρ†ΠΈΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Выглядит ΡƒΠΆΠ΅ Π²ΠΏΠΎΠ»Π½Π΅ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ. ΠœΠ°ΠΊΡ€ΠΎΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ Π² BOOST_PP_REPEAT, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ влоТСнности повторСния, Ссли ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ повторСния, ΠΌΡ‹ Π΅Π³ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ β€” счётчик, тСкущая итСрация β€” индСкс Π² нашСй Ρ‚Π°Π±Π»ΠΈΡ†Π΅. Π’Ρ€Π΅Ρ‚ΠΈΠΉ β€” Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΌΡ‹ Π² Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы.

Как-ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ BOOST_PP_REPEAT, Ссли Π² пСрпроцСссорС Π½Π΅Ρ‚ Π½ΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ², Π½ΠΈ рСкурсии. ΠžΡ‡Π΅Π½ΡŒ просто β€” ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ 256 макросов с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° BOOST_PP_REPEAT_x, Π³Π΄Π΅ Ρ… β€” Π½ΠΎΠΌΠ΅Ρ€ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π° ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅. Π’ макросС BOOST_PP_REPEAT склСиваСтся имя макроса этой Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΈΠ· Ρ‚ΠΎΠΊΠ΅Π½Π° BOOST_PP_REPEAT_ ΠΈ количСства Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ нСсколько ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠ΅ объяснСниС, Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‚Π°ΠΌ Ρ‡ΡƒΡ‚ΡŒ слоТнСС, Π½ΠΎ основной ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ‚Π°ΠΊΠΎΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *