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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования Π‘ΠΈ для ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 41

Автор C. Π‘ΠΎΡ‡ΠΊΠΎΠ²

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

/* ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 1 */

#if defined(CREDIT)

credit();

#elif defined (DEBIT)

debit();

#else

printerror();

#endif

/* ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 2 */

#if DLEVEL > 5

#define SIGNAL 1

#if STACKUSE == 1

#derine STACK 200

#else

#define STACK 100

#endif

#else

#define SIGNAL 0

#if STACKUSE == 1

#define STACK 100

#else

#define STACK 50

#endif

#endif

/* ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 3 */

#if DLEVEL == 0

#define STACK 0

#elif DLEVEL == 1

#define STACK 100

#elif DLEVEL > 5

display(debugptr);

#else

#define STACK 200

#endif

/* ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 4 */

#define REG 1 register

#define REG2 register

#if defined (M_86)

#define REG3

#define REG4

#else

#ifdefined(M_68000)

#define REG4 register

#endif

#endif

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #if, #elif, #else, #endif ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ компиляциСй ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ credit компилируСтся, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° имСнованная константа CREDIT. Если ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° имСнованная константа DEBIT, Ρ‚ΠΎ компилируСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ debit. Если Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· .ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… констант Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Ρ‚ΠΎ компилируСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printerror. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ CREDIT ΠΈ credit ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Π² языкС Π‘ΠΈ.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… прСдполагаСтся, Ρ‡Ρ‚ΠΎ константа DLEVEL ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #define.

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π΄Π²Π° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² #if, #else, #endif. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² обрабатываСтся, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ DLEVEL большС 5. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС обрабатываСтся Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π½Π°Π±ΠΎΡ€.

Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΡƒΠ»ΠΎΠ²Π½ΠΎΠΉ компиляции ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для Π²Ρ‹Π±ΠΎΡ€Π° тСкста Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константы DLEVEL. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° STACK опрСдСляСтся со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0, 100 ΠΈΠ»ΠΈ 200, Π² зависимости ΠΎΡ‚ значСния DLEVEL. Если DLEVEL большС 5, Ρ‚ΠΎ компилируСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ display, Π° константа STACK Π½Π΅ опрСдСляСтся.

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

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выдСляСт Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΎΠ²ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ записаны объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° содСрТит большС объявлСний ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… класса памяти register, Ρ‡Π΅ΠΌ имССтся рСгистров Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ срСдС, Ρ‚ΠΎ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΎΠ²ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, объявлСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… записаны Ρ€Π°Π½ΡŒΡˆΠ΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли Π±ΠΎΠ»Π΅Π΅ интСнсивно Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΏΠΎΠ·ΠΆΠ΅, Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² эффСктивности ΠΎΡ‚ использования рСгистров окаТСтся Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ рСгистровой памяти Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ константы REG1 ΠΈ REG2 ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова register. Они ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для объявлСния Π΄Π²ΡƒΡ… Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Ρ… Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ b ΠΈ c.

func(REG3 int Π°)

{

REG1 int b;

REG2 int c;

REG4 int d;

}

Если ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° константа М_86, прСпроцСссор удаляСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ REG3 ΠΈ REG4 ΠΈΠ· Ρ„Π°ΠΉΠ»Π° ΠΏΡƒΡ‚Π΅ΠΌ Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΈΡ… Π½Π° пустой тСкст. Π Π΅Π³ΠΈΡΡ‚Ρ€ΠΎΠ²ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² этом случаС ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ b ΠΈ с. Если ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ М_68000, Ρ‚ΠΎ всС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ с классом памяти register.

Если Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· констант β€” Π½ΠΈ М_86, Π½ΠΈ М_68000, β€” Ρ‚ΠΎ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΎΠ²ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π°, b ΠΈ с.

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

Бинтаксис:

#ifdef <ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€>

#ifndef <ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€>

Аналогично Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ #if, Π·Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ #ifdef ΠΈ #ifndef ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² #elif ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #else. Набор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #endif.

ИспользованиС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² #ifdef ΠΈ #ifndef эквивалСнтно ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #if, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ defined(<ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€>). Π­Ρ‚ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для совмСстимости с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ вСрсиями компиляторов языка Π‘ΠΈ. Для Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #if с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ defined(<ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€>).

Когда прСпроцСссор ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #ifdef, ΠΎΠ½ провСряСт, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π»ΠΈ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ <ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€> Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #define. Если Π΄Π°, условиС считаСтся истинным, Ссли Π½Π΅Ρ‚ β€” Π»ΠΎΠΆΠ½Ρ‹ΠΌ.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #ifndef ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Π° ΠΏΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ #ifdef. Если <ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€> Π½Π΅ Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #define, ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #undef, Ρ‚ΠΎ условиС считаСтся истинным. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС условиС Π»ΠΎΠΆΠ½ΠΎ.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ строк

Бинтаксис:

#line <константа> ["имя-Ρ„Π°ΠΉΠ»Π°"]

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #line сообщаСт компилятору языка Π‘ΠΈ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΈΠΌΠ΅Π½ΠΈ исходного Ρ„Π°ΠΉΠ»Π° ΠΈ порядка Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΠΈ строк. Π­Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ отраТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° диагностичСских сообщСниях компилятора: исходный Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ <имя-Ρ„Π°ΠΉΠ»Π°>, Π° тСкущая компилируСмая строка ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π½ΠΎΠΌΠ΅Ρ€ <константа>. ПослС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ строки счСтчик Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² строк увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π’ случаС измСнСния Π½ΠΎΠΌΠ΅Ρ€Π° строки ΠΈ ΠΈΠΌΠ΅Π½ΠΈ исходного Ρ„Π°ΠΉΠ»Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #line компилятор "Π·Π°Π±Ρ‹Π²Π°Π΅Ρ‚" ΠΈΡ… ΠΏΡ€Π΅ΠΆΠ½ΠΈΠ΅ значСния ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΡƒΠΆΠ΅ с Π½ΠΎΠ²Ρ‹ΠΌΠΈ значСниями.

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

<ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π°> Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ #line ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ†Π΅Π»ΠΎΠΉ константой. <Имя-Ρ„Π°ΠΉΠ»Π°> ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ символов, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. Если имя Ρ„Π°ΠΉΠ»Π° ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ, Ρ‚ΠΎ имя исходного Ρ„Π°ΠΉΠ»Π° остаСтся ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ.

Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ строки ΠΈ имя исходного Ρ„Π°ΠΉΠ»Π° доступны Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ‡Π΅Ρ€Π΅Π· псСвдопСрСмСнныС с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ __LINE__ ΠΈ __FILE__. Π­Ρ‚ΠΈ псСвдопСрСмСнныС ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для Π²Ρ‹Π΄Π°Ρ‡ΠΈ Π²ΠΎ врСмя выполнСния сообщСний ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎΠΌ мСстополоТСнии ошибки.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ псСвдопСрСмСнной __FILE__ являСтся строка, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ имя Ρ„Π°ΠΉΠ»Π°, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΈΠΌΠ΅Π½ΠΈ исходного Ρ„Π°ΠΉΠ»Π° Π½Π΅ трСбуСтся Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ сам ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ __FILE__ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹.

/* ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 1 */

#line 151 "copy.с"

/* ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 2 */

#define ASSERT(cond) if (!cond)\

{printf ("ошибка Π² строкС %d Ρ„Π°ΠΉΠ»Π° %s\n", \

__LINE__, __FILE__);} else;

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ устанавливаСтся имя исходного Ρ„Π°ΠΉΠ»Π° сору.с ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ строки 151.

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π² ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ASSERT ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ псСвдопСрСмСнныС __LINE__ ΠΈ __FILE__ для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ сообщСния ΠΎΠ± ошибкС, содСрТащСго ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ исходного Ρ„Π°ΠΉΠ»Π°, Ссли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ условиС, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΌΠ°ΠΊΡ€ΠΎΠ°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ cond, Π»ΠΎΠΆΠ½ΠΎ.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок

Π’ БП Π’Π‘ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° #error. Π•Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚:

#error <тСкст>

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ эту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ срСди Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² условной компиляции для обнаруТСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ нСдопустимой ситуации. По Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ #error прСпроцСссор ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΈ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ сообщСниС:

Fatal: <имя-Ρ„Π°ΠΉΠ»Π°> <Π½ΠΎΠΌΠ΅Ρ€-строки> Error directive: <тСкст>

Fatal β€” ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ошибки; <имя-Ρ„Π°ΠΉΠ»Π°> β€” имя исходного Ρ„Π°ΠΉΠ»Π°; <Π½ΠΎΠΌΠ΅Ρ€-строки> β€” Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ строки; Error directive β€” сообщСниС ΠΎΠ± ошибкС Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅; <тСкст> β€” собствСнно тСкст диагностичСского сообщСния.

НапримСр, Ссли имСнованная константа MYVAL ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π»ΠΈΠ±ΠΎ 0, Π»ΠΈΠ±ΠΎ 1, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² исходный Ρ„Π°ΠΉΠ» ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ условной компиляции для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ MYVAL:

#if (MYVAL != 0 && MYVAL != 1)

#error MYVAL Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π»ΠΈΠ±ΠΎ 0, Π»ΠΈΠ±ΠΎ 1

#endif

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ просматриваСт тСкст сообщСния Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ #error, ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ· Π½Π΅Π³ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ (Ссли ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ), Π½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ константы ΠΈ макроопрСдСлСния Π² тСкстС Π½Π΅ выявляСт ΠΈ макроподстановку Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚.

ΠŸΡƒΡΡ‚Π°Ρ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°

Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ БП Π’Π‘ распознаСт ΠΏΡƒΡΡ‚ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ, ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ· строки, содСрТащСй просто Π·Π½Π°ΠΊ #. Π­Ρ‚Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° всСгда игнорируСтся.

Указания компилятору языка Π‘ΠΈ

Бинтаксис:

#pragma <ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ-символов>

Указания компилятору, ΠΈΠ»ΠΈ ΠΏΡ€Π°Π³ΠΌΡ‹, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для исполнСния компилятором Π² процСссС Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹. <ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ-символов> Π·Π°Π΄Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ компилятору ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

Набор ΠΏΡ€Π°Π³ΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ компилятора языка Π‘ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½. Для получСния ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΡ€Π°Π³ΠΌΠ°Ρ… смотритС ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌΡƒ Π²Π°ΠΌΠΈ компилятору.