ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π² си: ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π² Π‘ ΠΈ Π‘++ / Π₯Π°Π±Ρ€

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΈ C++ | Microsoft Docs

  • Π§Ρ‚Π΅Π½ΠΈΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 2Β ΠΌΠΈΠ½

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅

C++ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ возмоТности, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ прСпроцСссором ANSI C. Π­Ρ‚ΠΈ Π½ΠΎΠ²Ρ‹Π΅ возмоТности ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‚ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ языка.

  • Π’ C++ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ, const ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² константных выраТСниях. Он позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ константы со свСдСниями ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ пСрСчислСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ просмотрСны символами с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°. ΠŸΡ€ΠΈ использовании Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора #define для опрСдСлСния констант ΠΎΠ½ΠΈ Π½Π΅ Ρ‚Π°ΠΊ Ρ‚ΠΎΡ‡Π½Ρ‹ ΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ строго Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ. Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ выдСляСтся

    const , Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ содСрТит Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΅Π³ΠΎ адрСс.

  • ВозмоТности встраиваСмых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ C++ Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‚ макросы Ρ‚ΠΈΠΏΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° использования встраиваСмых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с макросами ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Ρ‹ Π½ΠΈΠΆΠ΅.

    • Π’ΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ. Π’ΠΈΠΏΡ‹ встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ проходят Ρ‚Ρƒ ΠΆΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ строго Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ.

    • ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² с ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами. ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‚ выраТСния, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π² Π²ΠΈΠ΄Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π΅ сущСствуСт шанса, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎ встроСнных функциях см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ встроСнная __inline, _ _forceinline.

Для обСспСчСния ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости всС срСдства прСпроцСссора, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠΈΠ΅ Π² ANSI C ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… спСцификациях C++, сохранСны для Microsoft C++.

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅

ΠŸΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ макросы
ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ (C/C++)

c β€” Для Ρ‡Π΅Π³ΠΎ Π½ΡƒΠΆΠ½Ρ‹ макросы C?

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΊΠΎΠΌΡƒ-Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎ врСмя компиляции. Π£Ρ‡Ρ‚ΠΈ это:

  • ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ C ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎ врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
  • ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ C ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎ врСмя выполнСния
  • ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π‘ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎ врСмя компиляции

Π’ΠΎ врСмя компиляции ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π² Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ Ρ‡Ρ‚ΠΎ процСсс сборки ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния, Ссли ΠΎΠ½ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ с прСпроцСссором макроса. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: make Arch = arm (прСдполагаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ макроса пСрСсылки ΠΊΠ°ΠΊ cc -DARCH = arm)

ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹: (Из glibc limit.h ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ наибольшСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ long)

#if __WORDSIZE == 64
#define LONG_MAX 9223372036854775807L
#else
#define LONG_MAX 2147483647L
#endif

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ #define __WORDSIZE) Π²ΠΎ врСмя компиляции, Ссли ΠΌΡ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ для 32 ΠΈΠ»ΠΈ 64 Π±ΠΈΡ‚. Π’ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠ±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ инструмСнтов ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ -m32 ΠΈ -m64 ΠΌΠΎΠ³ΡƒΡ‚ автоматичСски ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΠΈΡ‚ΠΎΠ².

(Запрос вСрсии POSIX)

#define _POSIX_C_SOURCE 200809L

Запросы Π²ΠΎ врСмя компиляции ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ POSIX 2008. Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ (нСсовмСстимыС) стандарты, Π½ΠΎ с этим ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ½Π° прСдоставит ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: getline (), no gets () ΠΈ Ρ‚.Π΄.). Если Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ стандарт, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ #error Π²ΠΎ врСмя компиляции, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вмСсто сбоя Π²ΠΎ врСмя выполнСния.

(ТСстко Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ)

#ifndef LIBRARY_PATH
#define LIBRARY_PATH "/usr/lib"
#endif

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚, Π²ΠΎ врСмя компиляции ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ТСсткого ΠΊΠΎΠ΄Π°. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ -DLIBRARY_PATH =/home/user/lib. Если Π±Ρ‹ это Π±Ρ‹Π» const char *, ΠΊΠ°ΠΊ Π±Ρ‹ Π²Ρ‹ настроили Π΅Π³ΠΎ Π²ΠΎ врСмя компиляции?

(pthread.h, слоТныС опрСдСлСния Π²ΠΎ врСмя компиляции)

# define PTHREAD_MUTEX_INITIALIZER \
  { { 0, 0, 0, 0, 0, 0, { 0, 0 } } }

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ тСкста ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΈΠ½Π°Ρ‡Π΅, Ρ‡Ρ‚ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΎ (всСгда Π²ΠΎ врСмя компиляции). Π­Ρ‚ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ констант (Π²ΠΎ врСмя компиляции).

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

НаконСц, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎ ваТности условной компиляции Π²ΠΎ встроСнных систСмах, Π³Π΄Π΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ процСссора ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹, Π° систСмы ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π°Π·Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π²Ρ‹ спроситС, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС опрСдСлСния ΠΌΠ°ΠΊΡ€ΠΎ констант ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ опрСдСлСниями? ΠžΡ‚Π²Π΅Ρ‚ — Π΄Π°, Π½ΠΎ это Π½Π΅ просто устранит Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ измСнСния повСдСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎ врСмя компиляции. ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ всС Π΅Ρ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ.

Π’Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ макрос — это… Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π’Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ макрос?

Π’Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ макрос — Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ прСпроцСссором Π‘ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ макроса ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ числа Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

ΠœΠ°ΠΊΡ€ΠΎΡ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±Ρ‹Π» прСдставлСн Π² Ρ€Π΅Π²ΠΈΠ·ΠΈΠΈ ISO/IEC 9899:1999 (C99) стандарта языка программирования Π‘ΠΈ Π² 1999. Π’Π°ΠΊΠΆΠ΅ Ρ‚Π°ΠΊΠΈΠ΅ макросы Π±Ρ‹Π»ΠΈ Π²Π²Π΅Π΄Π΅Π½Ρ‹ Π² ISO/IEC 14882:2011 (C++11) стандарта языка программирования C++ Π² 2011 Π³ΠΎΠ΄Ρƒ[1].

Бинтаксис объявлСния

Бинтаксис объявлСния схоТ с синтаксисом Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: пропуск Β«…Β» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обозначСния Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠ»ΡŒ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹. ΠŸΡ€ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ макросом ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° __VA_ARGS__ Π² спискС замСщСния макроса замСняСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ.

Доступ ΠΊ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ Π² спискС Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π΅ осущСствляСтся Π½ΠΈ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π½ΠΈ ΠΏΠΎ способу, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°

GNU Compiler Collection, начиная с вСрсии 3.0, C++ Builder 2006 ΠΈ Visual Studio 2005 [1] ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ макросы с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ компиляции ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΊ Π½Π° языкС Π‘ΠΈ, Ρ‚Π°ΠΊ ΠΈ Π½Π° языкС C++. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, GCC ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ макросы ΠΏΡ€ΠΈ компиляции ΠΊΠΎΠ΄Π° Π½Π° языкС Objective-C.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Если трСбуСтся printf-подобная функция dprintf(), ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ имя Ρ„Π°ΠΉΠ»Π° ΠΈ Π½ΠΎΠΌΠ΅Ρ€ строки, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ вызываСтся Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ макрос:

void realdprintf (char const *file, int line, char const *fmt, ...); 
#define dprintf(...) realdprintf(__FILE__, __LINE__, __VA_ARGS__)

dprintf() ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° ΠΊΠ°ΠΊ:

ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дополняСтся Π΄ΠΎ:

realdprintf(__FILE__, __LINE__, "Hello, world");

ΠΈΠ»ΠΈ:

dprintf("%d + %d = %d", 2, 2, 5);

ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дополняСтся Π΄ΠΎ:

 
realdprintf(__FILE__, __LINE__, "%d + %d = %d", 2, 2, 5);

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ макросам ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΌΠ°ΠΊΡ€ΠΎΠ²Ρ‹Π·ΠΎΠ². НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ:

#ifdef TRACING
#define TRACE(_p)       printf _p
#else
#define TRACE(_p)
#endif

Если макрос TRACING ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π²ΠΎ врСмя компиляции, Π²Ρ‹Π·ΠΎΠ² макроса TRACE Π±ΡƒΠ΄Π΅Ρ‚ эквивалСнтСн Π²Ρ‹Π·ΠΎΠ²Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf:

TRACE(("ВыполняСтся строка %d\n", __LINE__));

Если макрос TRACING Π½Π΅ Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ сообщСния Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° Π΄Π°Π½Π½ΠΎΠ³ΠΎ макроса Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ скобки.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях вмСсто Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… макросов ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» stdargs языков Π‘ΠΈ/C++ ΠΈ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ vprintf.

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅

  • Вариативная функция

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

  1. ↑ Working draft changes for C99 preprocessor synchronization — http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm

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

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π² Π‘

На Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ 5 ΠΌΠΈΠ½ ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ΠΎΠ² 42 ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ

Всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄Β C компилируСтся Π²Β ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Linux, он пСрСдаСтся Ρ‚Π°ΠΊΠΎΠΌΡƒ компилятору, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠ΄ CΒ Π² Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ компиляции и запуском ΠΊΠΎΠ΄Π° C.Β ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ макроса сущСствуСт ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ имя прСпроцСссора C. На всСм языкС C макрос характСризуСтся ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠΎΠ΄Π°, Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΊΠ° ΠΈΒ Π·Π°Ρ‚Π΅ΠΌ отбрасываСмых, ΠΊΠΎΠ³Π΄Π° трСбуСтся этот Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΈ макросы часто Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с выраТСния Β«#Β», и компилятор выполняСт объявлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с такого Π·Π½Π°ΠΊΠ°. БущСствуСт Π΄Π²Π° Ρ‚ΠΈΠΏΠ° макросов C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ мы обсудим в сСгодняшнСй ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ макросы: Ссли структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄Π°Π²Π°Π»ΠΈΡΡŒ бСспорядочно, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ макросы Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½Ρ‹.

Ѐункция, подобная макросу: макросы, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ функциям, ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ макрос

ΠœΠ°ΠΊΡ€ΠΎΡ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, прСдставляСт собой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ распространСнный способ описания числовых констант. Π˜Ρ‚Π°ΠΊ, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ свою ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму Linux ΠΈΒ Π²ΠΎΠΉΠ΄ΠΈΡ‚Π΅ Π²Β Π½Π΅Π΅. На момСнт ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΡ‹Β ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π»ΠΈ систСму UbuntuΒ 20.04Β Linux. ПослС быстрого Π²Ρ…ΠΎΠ΄Π° в систСму запуститС ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ, Π½Π°ΠΆΠ°Π² Β«Ctrl + Alt + TΒ» ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ строку поиска в области «ДСйствия».

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1

Π˜Ρ‚Π°ΠΊ, создайтС Ρ„Π°ΠΉΠ» Ρ‚ΠΈΠΏΠ° CΒ Β«test.cΒ» ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π½Π°Π·ΠΎΠ²ΠΈΡ‚Π΅ Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ GNU Nano Editor. Π­Ρ‚ΠΎΡ‚ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ использовался для рСдактирования Ρ‚Π°ΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π²Β ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Linux.

Π€Π°ΠΉΠ» откроСтся быстро. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Β«stdio.hΒ». Код прСдставлСн Π½Π°Β ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅. ΠœΡ‹Β ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ #define ΠΊΠ°ΠΊ макрос для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Β«newΒ» со значСниСм Β«42Β». ΠœΡ‹Β Π½Π΅Β ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ»ΠΈ Π΅Π³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ мы опрСдСляСм ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с точкой с запятой Π²Β ΠΊΠΎΠ½Ρ†Π΅. НСт нСобходимости Π² Β«;Β» в макросах. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ΄ содСрТит «основной» ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ. В этом основном ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Β«newΒ» с нСкоторой строкой Π² ​​нСй. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈΒ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ Π²Β Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Ρ‡Π΅Ρ€Π΅Π· Β«Ctrl + SΒ» ΠΈΒ Β«Ctrl + XΒ» соотвСтствСнно.

ΠŸΠ΅Ρ€Π΅Π΄ запуском Ρ„Π°ΠΉΠ»Π° сначала Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ в вашСй систСмС Linux установлСн компилятор языка C. На момСнт написания этого руководства ΠΌΡ‹Β ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π»ΠΈ компилятор Β«gccΒ». Если Π²Ρ‹Β Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ запрос в своСй консоли.

$Β sudoΒ aptΒ installΒ gcc

ПослС установки компилятора мы скомпилируСм ΠΊΠΎΠ΄ с запросом Β«gccΒ». Π­Ρ‚ΠΎΡ‚ запрос Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π° для компиляции, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ компиляция ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ и ошибок Π½Π΅Β Π±Ρ‹Π»ΠΎ; мы запустим наш Ρ„Π°ΠΉΠ» ΡΒ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструкции Β«a.outΒ», ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅. Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ прСдставлСны Π½Π°Β ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ°ΠΊΡ€ΠΎΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2

Π’Π΅ΠΏΠ΅Ρ€ΡŒ у нас Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ макроса. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Β ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ. Π˜Ρ‚Π°ΠΊ, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ‚ΠΎΡ‚Β ΠΆΠ΅ Ρ„Π°ΠΉΠ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ наши строки ΠΊΠΎΠ΄Π°.

ΠœΡ‹Β ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ val со значСниСм float Β«5.765Β» в качСствС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ макроса Π²Β Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части ΠΊΠΎΠ΄Π° послС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’Π½ΡƒΡ‚Ρ€ΠΈ основной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° float, Β«rΒ» ΠΈΒ Β«aΒ», Π±Ρ‹Π»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π±Π΅Π· значСния во врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Β«rΒ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ радиус, а пСрСмСнная Β«aΒ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Β«ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒΒ». ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΏΠΎΠΊΠ°ΠΆΡƒΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ сообщСниС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ввСсти радиус по своСму Π²Ρ‹Π±ΠΎΡ€Ρƒ. Π‘Ρ‚Ρ€ΠΎΠΊΠ° scanf использовалась для получСния Π²Π²ΠΎΠ΄Π° ΠΎΡ‚Β ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Ρ‡Π΅Ρ€Π΅Π· Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π». Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΡΒ ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΈΒ Π±ΡƒΠ΄Π΅Ρ‚ привязано ΠΊΒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Β«rΒ». ΠœΡ‹Β Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΠ»ΠΈ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ Β«Π°Β», вычисляя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ ΠΌΠ°ΠΊΡ€ΠΎΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ и радиус, Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π²Β ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС. ПослС этого рассчитанная ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ на экранС Π²Β Π²ΠΈΠ΄Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ.

Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ΄ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΡΒ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Β«gccΒ».

ЗапуститС Ρ„Π°ΠΉΠ» ΠΈΒ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ радиус по запросу, и он рассчитаСт ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ для Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π°ΠΌΠΈ значСния.

Ѐункция ΠΊΠ°ΠΊ макрос

Π’Β Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ макросу, ΠΌΡ‹Β ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ вмСсто любой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π˜Ρ‚Π°ΠΊ, приступим.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1

ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Β C test.c, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄.

Ѐункция «слияниС» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ макрос с двумя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ в своСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅. Π’Ρ‹Β Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ использовании макрос-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ #define, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ваша машина Π½Π΅Β ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π±Π΅Π· Π½Π΅Π΅. Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹Β ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Β«a ## bΒ». Основной ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ слияниС Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ цСлочислСнного Ρ‚ΠΈΠΏΠ°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… в качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ слияния Π²Β Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΒ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова Β«gccΒ».

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° Β«test.cΒ» Π²Ρ‹Β ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ объСдинСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠΈΡ… Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ цСлочислСнного Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π²Β ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ слияния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим послСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ макрос. На этот Ρ€Π°Π· ΠΌΡ‹Β ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с опрСдСлСнным ΠΏΡ€Π΅Π΄Π΅Π»ΠΎΠΌ. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ C-Ρ„Π°ΠΉΠ» Β«test.cΒ».

ΠœΡ‹Β Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ MACRO, Π²Β ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСмСнная Β«aΒ» прСдставляСт Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π°Β Β«limΒ» прСдставляСт ΠΊΠΎΠ½Π΅Ρ† ограничСния. Пока Β«aΒ» мСньшС, Ρ‡Π΅ΠΌ Β«limΒ», ΠΎΠ½Β Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ строку Β«AqsaΒ» ΠΈΒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Β«aΒ». Основной ΠΌΠ΅Ρ‚ΠΎΠ΄ содСрТит Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«aΒ», Π°Β ΠΌΠ΅Ρ‚ΠΎΠ΄ MACRO ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«8Β», ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ Π²Β Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Β«limΒ», поэтому ΠΎΠ½Β Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ строку Β«8Β» Ρ€Π°Π·.

Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π·:

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° строка Β«AqsaΒ» пСчатаСтся 8Β Ρ€Π°Π·.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

В этом руководствС мы рассмотрСли ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΈΒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ макросы. ΠœΡ‹Β Π½Π°Π΄Π΅Π΅ΠΌΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Β Ρ€Π°Π·Π²Π΅Π΅Ρ‚ всС ваши сомнСния и прояснит ваши прСдставлСния о макросах C.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ макросы Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ соврСмСнных языков программирования?

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ваши вопросы, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, для Ρ‡Π΅Π³ΠΎ прСимущСствСнно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ макросы (ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: скомпилированный ΠΌΠΎΠ·Π³).

  • ΠœΠ°ΠΊΡ€ΠΎΡΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для опрСдСлСния символичСских констант #define X 100

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°: const int X = 100;

  • ΠœΠ°ΠΊΡ€ΠΎΡΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для опрСдСлСния (ΠΏΠΎ сущСству) встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½Π΅ зависящих ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° #define max(X,Y) (X>Y?X:Y)

Π’ любом языкС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, это ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ бСзопасным для Ρ‚ΠΈΠΏΠΎΠ² способом, пСрСгруТая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΈΠ»ΠΈ, Π² языкС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ значСния, ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. ΠœΠ°ΠΊΡ€ΠΎΡ с Ρ€Π°Π΄ΠΎΡΡ‚ΡŒΡŽ попытаСтся ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈΠ»ΠΈ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½ΠΎ это ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли Π²Ρ‹ сдСлали макросы бСзопасными ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ, ΠΎΠ½ΠΈ Π½Π΅ Π΄Π°Π΄ΡƒΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… прСимущСств ΠΈΠ»ΠΈ удобства ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ функциями.

  • ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для указания ярлыков для часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… элСмСнтов. #define p printf

Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, p()которая Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС. Π­Ρ‚ΠΎ довольно слоТно Π² C (Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ использования va_arg()сСмСйства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ), Π½ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, это Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² языкС, Π° Π½Π΅ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ макроязыкС, ΠΏΡ€ΠΎΡ‰Π΅, ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Π° ошибкам ΠΈ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ мСньшС сбиваСт с Ρ‚ΠΎΠ»ΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΡ…, Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ΄. На самом Π΄Π΅Π»Π΅, я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° использования макросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ нСльзя Π»Π΅Π³ΠΊΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ способом. Волько мСсто , Π³Π΄Π΅ макросы Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ привязаны ΠΊ условной компиляции конструкций , Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ #if( ΠΈ Ρ‚.Π΄.).

По этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ я Π½Π΅ Π±ΡƒΠ΄Ρƒ ΡΠΏΠΎΡ€ΠΈΡ‚ΡŒ с Π²Π°ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ нСпроцСссорныС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ условной компиляции Π² популярных языках Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Π² Java). Но Ρ‚Π°ΠΊΠΈΠ΅ языки, ΠΊΠ°ΠΊ D, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ прСпроцСссора ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌΠΈ, Ρ‡Π΅ΠΌ использованиС условных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ прСпроцСссора, Π½ΠΎ ΠΏΡ€ΠΈ этом Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ ошибкам.

1.19. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ макроса. C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½ΠΎΠ³ΠΎ тСстирования Π² большСй стСпСни, Ρ‡Π΅ΠΌ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструмСнты, Π²Ρ‹Ρ€Π°ΠΆΠ°ΡŽΡ‚ нашС прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ Β«Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉΒ» Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ. Когда бизнСс-Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ ΠΈ спСциалисты ΠΏΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŽ качСства ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ,

4.1.1 ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅

4.1.1 ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π˜Π½Π΄Π΅ΠΊΡΡ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π° дискС Π² статичСской Ρ„ΠΎΡ€ΠΌΠ΅ ΠΈ ядро считываСт ΠΈΡ… Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ДисковыС индСксы Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ поля:β€’ Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Ρ„Π°ΠΉΠ»Π°. ΠŸΡ€Π°Π²Π° собствСнности Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ IP ΠΏΠΎ ICQ

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ IP ΠΏΠΎ ICQ Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ IP Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ общаСтся с Π²Π°ΠΌΠΈ посрСдством ICQ, достаточно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ UIN2IP (http://neptunix.narod.ru/uin.htm).Π’ΠΎΡ‚ список Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ UIN2IP:– автоматичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ листа;– автоматичСскоС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ IP-адрСса Π² Π±ΡƒΡ„Π΅Ρ€ ΠΏΡ€ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠΌ

2.2.1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅

2.2.1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π’ ΠΎΠ±Ρ‰Π΅ΠΌ смыслС, контСкстная Ρ€Π΅ΠΊΠ»Π°ΠΌΠ° – это Π²ΠΈΠ΄ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-Ρ€Π΅ΠΊΠ»Π°ΠΌΡ‹, дСмонстрируСмой Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ Π² зависимости ΠΎΡ‚ содСрТимого ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-страницы, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° располоТСна. НапримСр, объявлСниС ΠΎ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠ΅ автомобиля Π½Π° сайтС ΠΎΠ± автомобилях, Ρ€Π΅ΠΊΠ»Π°ΠΌΠ° сотовых

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π—Π°ΠΏΠΈΡΡŒ макроса

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π—Π°ΠΏΠΈΡΡŒ макроса Π’ зависимости ΠΎΡ‚ прилоТСния, Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π—Π°ΠΏΠΈΡΡŒ макроса ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ. Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².* Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ мСсто для Π²Π²ΠΎΠ΄Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ описания макроса.* Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρƒ вас Π±ΡƒΠ΄ΡƒΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΏΡ€ΠΈ

Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° макроса Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Visual Basic

Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° макроса Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Visual Basic ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ макрос записан, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ VBA-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, просто Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° строки Π΅Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°). Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.1. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ БСрвис=ΠœΠ°ΠΊΡ€ΠΎΡ=ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΈΠ»ΠΈ

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ макроса

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ макроса Запуск макроса ΠΈΠ· Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠœΠ°ΠΊΡ€ΠΎΡ вряд Π»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ большим достиТСниСм.ВыполняСмая ΠΏΡ€ΠΈ этом ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ шагов Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ.1. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ макрос ΠΈΠ· списка Π½ΠΈΠΆΠ΅ поля Имя.2. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ.Ну ΠΊΠ°ΠΊ, ΠΊΡ€ΡƒΡ‚ΠΎ? Как

Поиск макроса Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ ΠœΠ°ΠΊΡ€ΠΎΡ

Поиск макроса Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ ΠœΠ°ΠΊΡ€ΠΎΡ Π’ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ ΠœΠ°ΠΊΡ€ΠΎΡ ΠΈΠΌΠ΅Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² спискС VBA-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ (макросов) ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΠ±ΠΈΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ. Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π³Π΄Π΅ хранится ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² спискС с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Π΅Π΅ прСфиксом.Рассмотрим для

НазначСниС макроса ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠΏΠ°Π½Π΅Π»ΠΈ быстрого запуска

НазначСниС макроса ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠΏΠ°Π½Π΅Π»ΠΈ быстрого запуска Если Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ макрос с ΠΏΠ°Π½Π΅Π»ΠΈ быстрого доступа, Ρ‚ΠΎ сдСлайтС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.1. НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Π² области ΠΠ°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ макрос. ΠŸΠΎΡΠ²ΠΈΡ‚ΡΡ ΠΎΠΊΠ½ΠΎ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Word с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ Настройка (рис. 9.3). Рис. 9.3.

НазначСниС макроса клавишам

НазначСниС макроса клавишам МногиС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для выполнСния Ρ€Π°Π·Π½Ρ‹Ρ… дСйствий сочСтания клавиш. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ сочСтания клавиш макросам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅. Для этого сдСлайтС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.1. Π’ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π—Π°ΠΏΠΈΡΡŒ макроса

Π—Π°ΠΏΠΈΡΡŒ макроса

Π—Π°ΠΏΠΈΡΡŒ макроса Когда ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊ записи макроса. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹ Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚Π΅ ΠΎΠΊΠ½Π° назначСния макроса ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠΏΠ°Π½Π΅Π»ΠΈ быстрого доступа ΠΈΠ»ΠΈ клавишам, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² Ρ€Π΅ΠΆΠΈΠΌ записи макроса. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Π²ΠΈΠ΄ Π° ΠΊΠ½ΠΎΠΏΠΊΠ° Π²

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ макроса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΊΠ½Π° ΠœΠ°ΠΊΡ€ΠΎΡ

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ макроса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΊΠ½Π° ΠœΠ°ΠΊΡ€ΠΎΡ Π’Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ макросы ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ сочСтания клавиш ΠΈΠ»ΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ быстрого доступа, Π½ΠΎ ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŽ ΠΎΠΊΠ½Π° ΠœΠ°ΠΊΡ€ΠΎΡ. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π»Π΅Π½Ρ‚Ρ‹ ΠΈΠ»ΠΈ

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния физичСской ΠΌΠΎΠ΄Π΅Π»ΠΈ, XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ тСкстом. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ тСкстовый Π²ΠΈΠ΄. ВмСстС с Ρ‚Π΅ΠΌ, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,

ИспользованиС макроса ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ слоТного запроса

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

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ собствСнных макросов

8. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ собствСнных макросов

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

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

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

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ Мака: обычная такая история

Когда-Ρ‚ΠΎ, Π΄Π°Π²Π½Ρ‹ΠΌ-Π΄Π°Π²Π½ΠΎ, ΠΆΠΈΠ»Π°-Π±Ρ‹Π»Π° компания Lisp программистов. Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Ρ‚Π°ΠΊ Π΄Π°Π²Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² Lisp Π΄Π°ΠΆΠ΅ Π½Π΅ сущСствовало макросов. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· всС Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ сдСлано с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ спСциализированных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹Ρ‚ΡŒ написано Π² ΠΏΠΎΠ»Π½ΠΎΠΌ объСмС, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ довольно Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΌ Π΄Π΅Π»ΠΎΠΌ. К соТалСнию, программисты Π² этой ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π±Ρ‹Π»ΠΈ Ρ…ΠΎΡ‚ΡŒ ΠΈ блСстящи, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π½ΠΈΠ²Ρ‹. НСрСдко Π² своих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, ΠΊΠΎΠ³Π΄Π° процСсс написания Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов ΠΊΠΎΠ΄Π° становился слишком ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»Π΅Π½, ΠΎΠ½ΠΈ вмСсто ΠΊΠΎΠ΄Π° писали ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Π² этом мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠΎΠ΄. К Π΅Ρ‰Π΅ Π±ΠΎΠ»ΡŒΡˆΠ΅ΠΌΡƒ соТалСнию, ΠΈΠ·-Π·Π° своСй Π»Π΅Π½ΠΈ программисты Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅Π½Π°Π²ΠΈΠ΄Π΅Π»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π½Π°Π·Π°Π΄ ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, описанный Π² коммСнтариях. ВскорС компания ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΊΡƒΡ‡Ρƒ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΌΠΎΠ³ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±Ρ‹Π» ΠΏΠΎΠ»ΠΎΠ½ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² с описаниСм Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ прСдстоит Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ.

Π’ отчаянии большой босс нанял младшСго (junior) программиста, Мака, Ρ‡ΡŒΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ стал поиск ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², написаниС Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ вставка Π΅Π³ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° мСсто ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². Мак Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ запускал ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, вСдь ΠΎΠ½ΠΈ Π½Π΅ Π±Ρ‹Π»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Ρ‹ ΠΈ поэтому ΠΎΠ½ попросту Π½Π΅ ΠΌΠΎΠ³ этого ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Но Π΄Π°ΠΆΠ΅ Ссли Π±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Ρ‹, Мак Π½Π΅ Π·Π½Π°Π», ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π°Ρ‚ΡŒ Π½Π° ΠΈΡ… Π²Ρ…ΠΎΠ΄. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ просто писал свой ΠΊΠΎΠ΄, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° содСрТимом ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², ΠΈ посылал Π΅Π³ΠΎ Π½Π°Π·Π°Π΄ ΡΠΎΠ·Π΄Π°Π²ΡˆΠ΅ΠΌΡƒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ программисту.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Мака всС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ вскорС Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ΄Π΅Π»Π°Π½Ρ‹, ΠΈ компания Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΡƒΠΉΠΌΡƒ Π΄Π΅Π½Π΅Π³ продавая ΠΈΡ…: Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π΅Π½Π΅Π³, Ρ‡Ρ‚ΠΎ смогла ΡƒΠ΄Π²ΠΎΠΈΡ‚ΡŒ количСство программистов. Но ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π΄ΡƒΠΌΠ°Π» Π½Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π² ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠœΠ°ΠΊΡƒ; вскорС ΠΎΠ½ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π» нСскольким дюТинам программистов. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ всС своС врСмя Π½Π° поиск ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² Π² исходном ΠΊΠΎΠ΄Π΅, Мак внСс нСбольшиС измСнСния Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ программистами компилятор. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли компилятор встрСчал ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, Ρ‚ΠΎ отсылал Π΅Π³ΠΎ элСктронной ΠΏΠΎΡ‡Ρ‚ΠΎΠΉ ΠœΠ°ΠΊΡƒ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΆΠ΄Π°Π» ΠΎΡ‚Π²Π΅Ρ‚Π° с Π·Π°ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΊΠΎΠ΄ΠΎΠΌ. К соТалСнию, Π΄Π°ΠΆΠ΅ с этими измСнСниями ΠœΠ°ΠΊΡƒ Π±Ρ‹Π»ΠΎ тяТСло ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒ запросам программистов. Он Ρ€Π°Π±ΠΎΡ‚Π°Π» Ρ‚Π°ΠΊ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ³, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π°, особСнно ΠΊΠΎΠ³Π΄Π° записи Π½Π΅ Π±Ρ‹Π»ΠΈ ясны, ΠΎΠ½ допускал ошибки.

Однако программисты ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‡Π΅ΠΌ Ρ‚ΠΎΡ‡Π½Π΅Π΅ ΠΎΠ½ΠΈ ΠΏΠΈΡˆΡƒΡ‚ свои ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Ρ‚Π΅ΠΌ большС Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Мак Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄. Как-Ρ‚ΠΎ Ρ€Π°Π· ΠΎΠ΄ΠΈΠ½ ΠΈΠ· программистов, встрСтив Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π½ΠΈΠ΅ с описаниСм Π² словах Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ» Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° Lisp, которая Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π»Π° Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π±Ρ‹Π» ΡƒΠ΄ΠΎΠ±Π΅Π½ ΠœΠ°ΠΊΡƒ: ΠΎΠ½ просто запустил ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ послал Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ компилятору.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π²ΠΎ появилось, ΠΊΠΎΠ³Π΄Π° программист вставил Π² самый Π²Π΅Ρ€Ρ… ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· своих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, содСрТащий ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ пояснСниС, гласившСС: «ΠœΠ°ΠΊ, Π½Π΅ пиши здСсь Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π½ΠΎ сохрани эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π° Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅; я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… своих коммСнтариях.» Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ гласили ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: «ΠœΠ°ΠΊ, Π·Π°ΠΌΠ΅Π½ΠΈ этот ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с символами x ΠΈ y ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ.»

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ распространился Ρ‚Π°ΠΊ быстро, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄Π½Π΅ΠΉ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ стало ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄ΡŽΠΆΠΈΠ½Ρ‹ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² с описаниСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ использовались Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄ΠΎΠΌ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… коммСнтариях. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ ΠœΠ°ΠΊΡƒ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², содСрТащих Ρ‚ΠΎΠ»ΡŒΠΊΠΎ опрСдСлСния ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°, программисты ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΈ ΠΈΡ… стандартным прСдисловиСм: «Definition for Mac, Read Only» (ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для Мака, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния). Π­Ρ‚ΠΎ (ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΌΠ½ΠΈΠΌ, программисты Π±Ρ‹Π»ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π½ΠΈΠ²Ρ‹) быстро ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΠ»ΠΎΡΡŒ Π΄ΠΎ «DEF. MAC. R/O», Π° ΠΏΠΎΡ‚ΠΎΠΌ Π΄ΠΎ «DEFMACRO».

ΠžΡ‡Π΅Π½ΡŒ скоро Π² коммСнтариях для Мака Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ английского. Π¦Π΅Π»Ρ‹ΠΌΠΈ днями ΠΎΠ½ Ρ‡ΠΈΡ‚Π°Π» ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°Π» Π½Π° элСктронныС письма ΠΎΡ‚ компилятора, содСрТащиС DEFMACRO ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, описанныС Π² DEFMACRO. Π’Π°ΠΊ ΠΊΠ°ΠΊ Lisp ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² коммСнтариях осущСствляли всю Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° с элСктронными письмами пСрСстала Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Π£ Мака Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ стало ΠΌΠ½ΠΎΠ³ΠΎ свободного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΈ ΠΎΠ½ сидСл Π² своСм ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅ ΠΈ Π³Ρ€Π΅Π·ΠΈΠ» ΠΎ Π±Π΅Π»Ρ‹Ρ… пСсчаных пляТах, чистой Π³ΠΎΠ»ΡƒΠ±ΠΎΠΉ окСанской Π²ΠΎΠ΄Π΅ ΠΈ Π½Π°ΠΏΠΈΡ‚ΠΊΠ°Ρ… с малСнькими Π±ΡƒΠΌΠ°ΠΆΠ½Ρ‹ΠΌΠΈ Π·ΠΎΠ½Ρ‚ΠΈΠΊΠ°ΠΌΠΈ.

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

ВрСмя раскрытия макросов ΠΏΡ€ΠΎΡ‚ΠΈΠ² Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния

ΠšΠ»ΡŽΡ‡ΠΎΠΌ ΠΊ пониманию макросов являСтся ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ΄ΠΎΠΌ, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ (макросами), ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС выполняСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ (всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅). Когда Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ макросы, Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ компилятором для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ скомпилирован. Волько послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ всС макросы Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ раскрыты, Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ скомпилирован, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° смоТСт Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π°. ВрСмя, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ макросы, называСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ раскрытия макросов; ΠΎΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, ΠΊΠΎΠ³Π΄Π° выполняСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΊΠΎΠ΄, сгСнСрированный макросами.

ΠžΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ это Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π²ΠΎ врСмя раскрытия макросов, запускаСтся Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, сильно ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰Π΅ΠΌΡΡ ΠΎΡ‚ окруТСния ΠΊΠΎΠ΄Π°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π²ΠΎ врСмя выполнСния. А ΠΈΠΌΠ΅Π½Π½ΠΎ, Π²ΠΎ врСмя раскрытия макросов Π½Π΅ сущСствуСт способа ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎ врСмя выполнСния. Подобно ΠœΠ°ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠ³ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π», Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ Π·Π½Π°Π», Ρ‡Ρ‚ΠΎ являСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ Π²Ρ…ΠΎΠ΄ΠΎΠΌ для Π½ΠΈΡ…, ΠΊΠΎΠ΄, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π²ΠΎ врСмя раскрытия макросов, ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ исходного ΠΊΠΎΠ΄Π°. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ исходный ΠΊΠΎΠ΄ появляСтся Π³Π΄Π΅-Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅:

(defun foo (x)
Β Β (when (> x 10) (print 'big)))

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹ Π±Ρ‹ Π΄ΡƒΠΌΠ°Π»ΠΈ ΠΎ x ΠΊΠ°ΠΊ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ foo. Но Π²ΠΎ врСмя раскрытия макросов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ³Π΄Π° компилятор выполняСт макрос WHEN) СдинствСнными доступными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ являСтся исходный ΠΊΠΎΠ΄. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠΊΠ° Π½Π΅ выполняСтся, Π½Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° foo ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅Ρ‚ значСния, ассоциированного с x. ВмСсто этого, значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ компилятор ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π² WHEN, ΡΠ²Π»ΡΡŽΡ‚ΡΡ списками Lisp, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌΠΈ исходный ΠΊΠΎΠ΄, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ (> x 10) ΠΈ (print 'big). ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ WHEN ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, ΠΊΠ°ΠΊ Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(defmacro when (condition &rest body)
Β Β `(if ,condition (progn ,@body)))

ΠŸΡ€ΠΈ компиляции ΠΊΠΎΠ΄Π° foo, макрос WHEN Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½ с этими двумя Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ condition Π±ΡƒΠ΄Π΅Ρ‚ связан с Ρ„ΠΎΡ€ΠΌΠΎΠΉ (> x 10), Π° Ρ„ΠΎΡ€ΠΌΠ° (print 'big) Π±ΡƒΠ΄Π΅Ρ‚ собрана (will be collected) Π² список (ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π΅Π³ΠΎ СдинствСнным элСмСнтом), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ станСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° &rest body. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ квазицитирования Π·Π°Ρ‚Π΅ΠΌ сгСнСрируСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

(if (> x 10) (progn (print 'big)))

подставляя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ condition, Π° Ρ‚Π°ΠΊΠΆΠ΅ вклСивая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ body Π² PROGN.

Когда Lisp интСрпрСтируСтся, Π° Π½Π΅ компилируСтся, Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ раскрытия макросов ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ выполнСния ΠΌΠ΅Π½Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ «ΠΏΠ΅Ρ€Π΅ΠΏΠ»Π΅Ρ‚Π΅Π½Ρ‹» Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (temporally intertwined). Π’Π°ΠΊΠΆΠ΅ стандарт языка Π½Π΅ спСцифицируСт Π² точности Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ макросы: ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ всС макросы Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ с нСпосрСдствСнно интСрпрСтирования Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ макросы ΠΏΡ€ΠΈ ΠΈΡ… встрСчС. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях макросам всСгда ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ нСвычислСнныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Lisp, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄Ρ„ΠΎΡ€ΠΌΡ‹ Ρ„ΠΎΡ€ΠΌΡ‹ макроса, ΠΈ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ макроса всС Ρ‚Π°ΠΊΠΆΠ΅ являСтся Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ осущСствит ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ дСйствия, Π° Π½Π΅ нСпосрСдствСнноС осущСствлСниС этих дСйствий.

DEFMACRO

Как Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Π³Π»Π°Π²Π΅ 3, макросы Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΠΎΡ€ΠΌ DEFMACRO, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, разумССтся, «DEFine MACRO», Π° Π½Π΅ «Definition for Mac». Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон DEFMACRO ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° шаблон DEFUN.

(defmacro name (parameter*)
"Optional documentation string."
body-form*)

Подобно функциям, макрос состоит ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ, списка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ строки Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ Ρ‚Π΅Π»Π°, состоящСго ΠΈΠ· Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Lisp 1). Однако, ΠΊΠ°ΠΊ я Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ макроса Π½Π΅ являСтся осущСствлСниС ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ дСйствия Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, β€” Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ являСтся Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ сдСлаСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всю ΠΌΠΎΡ‰ΡŒ Lisp ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ своих раскрытий, поэтому Π² этой Π³Π»Π°Π²Π΅ я смогу Π΄Π°Ρ‚ΡŒ лишь ΠΎΠ±Π·ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ макросов. Однако я ΠΌΠΎΠ³Ρƒ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ процСсс написания макросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для всСх Ρ‚ΠΈΠΏΠΎΠ² макросов, ΠΎΡ‚ самых простых Π΄ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ слоТных.

Π—Π°Π΄Π°Ρ‡Π΅ΠΉ макроса являСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ макроса (Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ρ„ΠΎΡ€ΠΌΡ‹ Lisp, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ являСтся имя макроса) Π² ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ осущСствляСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ дСйствия. Иногда Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ макрос начиная с Ρ‚ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ„ΠΎΡ€ΠΌΡ‹ макроса. Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π· Π²Ρ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ макрос послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ использовали ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† ΠΊΠΎΠ΄Π° нСсколько Ρ€Π°Π· ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ваш ΠΊΠΎΠ΄ Ρ‡ΠΈΡ‰Π΅ ΠΏΡƒΡ‚Π΅ΠΌ абстрагирования этого ΠΎΠ±Ρ€Π°Π·Ρ†Π°.

НСсмотря Π½Π° Ρ‚ΠΎ, с ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ†Π° Π²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Π΅Ρ† ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ смоТСтС Π½Π°Ρ‡Π°Ρ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ макрос: Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΈ Ρ‚ΠΎ, ΠΎΡ‚ΠΊΡƒΠ΄Π° Π΄Π²ΠΈΠΆΠ΅Ρ‚Π΅ΡΡŒ, ΠΈ Ρ‚ΠΎ, ΠΊΡƒΠ΄Π°, Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ смоТСтС Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΠΉ это автоматичСски. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ шагом Π² написании макроса являСтся написаниС ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹Π·ΠΎΠ²Π° макроса, ΠΈ ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ этот Π²Ρ‹Π·ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒΡΡ.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ Π΅Π³ΠΎ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ раскрытиС, Π²Ρ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΡˆΠ°Π³Ρƒ: фактичСскому написанию ΠΊΠΎΠ΄Π° макроса. Для простых макросов это Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ написания шаблона-квазицитирования с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ макроса, вставлСнными Π½Π° Π½ΡƒΠΆΠ½Ρ‹Π΅ мСста. Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ макросы сами Π±ΡƒΠ΄ΡƒΡ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ….

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

Подводя ΠΈΡ‚ΠΎΠ³ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ шаги ΠΏΠΎ написанию макросов ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

1. НаписаниС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹Π·ΠΎΠ²Π° макроса, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ раскрыт (ΠΈΠ»ΠΈ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС).

2. НаписаниС ΠΊΠΎΠ΄Π°, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ написанный Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΊΠΎΠ΄ раскрытия ΠΏΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹Π·ΠΎΠ²Π°.

3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ прСдоставляСмая макросом абстракция Π½Π΅ «ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°Π΅Ρ‚».

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ макроса: do-primes

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ этот Ρ‚Ρ€Ρ‘Ρ…ΡˆΠ°Π³ΠΎΠ²Ρ‹ΠΉ процСсс осущСствляСтся, Π²Ρ‹ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ макрос do-primes, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ итСрирования, ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ DOTIMES ΠΈ DOLIST, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ вмСсто итСрирования ΠΏΠΎ Ρ†Π΅Π»Ρ‹ΠΌ числам ΠΈΠ»ΠΈ элСмСнтам списка ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ простым числам. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ являСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ макроса, ΠΎΠ½ β€” всСго лишь срСдство дСмонстрации Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ процСсса.

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

(defun primep (number)
Β Β (when (> number 1)
Β Β Β Β (loop for fac from 2 to (isqrt number) never (zerop (mod number fac)))))

(defun next-prime (number)
Β Β (loop for n from number when (primep n) return n))

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ макрос. БлСдуя ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅, ΠΎΡ‡Π΅Ρ€Ρ‡Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅, Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π° макроса ΠΈ ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ раскрыт. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π°Ρ‡Π°Π»ΠΈ с мысли ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

(do-primes (p 0 19)
Β Β (format t "~d " p))

для выраТСния Ρ†ΠΈΠΊΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт Ρ‚Π΅Π»ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ простого числа, большСго Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½ΠΎΠ³ΠΎ 0 ΠΈ мСньшСго Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½ΠΎΠ³ΠΎ 19, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ p для хранСния ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ простого числа. Π˜ΠΌΠ΅Π΅Ρ‚ смысл ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот макрос с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартных макросов DOLIST ΠΈ DOTIMES; макрос, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… макросов, Π»Π΅Π³Ρ‡Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π΅ΠΆΠ΅Π»ΠΈ макросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вводят Π½Π΅ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ синтаксис.

Π‘Π΅Π· использования макроса do-primes Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Ρ†ΠΈΠΊΠ» ΠΏΡƒΡ‚Π΅ΠΌ использования DO (ΠΈ Π΄Π²ΡƒΡ… Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ€Π°Π½Π΅Π΅) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(do ((p (next-prime 0) (next-prime (1+ p))))
Β Β Β Β ((> p 19))
Β Β (format t "~d " p))

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ написанию ΠΊΠΎΠ΄Π° макроса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅.

ΠœΠ°ΠΊΡ€ΠΎΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π² макрос, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Lisp, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌΠΈ исходный ΠΊΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π° макроса, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ шагом любого макроса являСтся ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅Ρ… частСй этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½Ρ‹ для вычислСния раскрытия. Для макросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ просто ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ свои Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² шаблон, этот шаг Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»Π΅Π½: ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ простоС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для Π·Π°Ρ…Π²Π°Ρ‚Π° Π½ΡƒΠΆΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Но, каТСтся, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° нСдостаточно для do-primes. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° do-primes являСтся списком, содСрТащим имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ†ΠΈΠΊΠ»Π°, p; ниТнюю Π³Ρ€Π°Π½ΠΈΡ†Ρƒ, 0; Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ, 19. Но, Ссли Π²Ρ‹ посмотритС Π½Π° раскрытиС, список, ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅, Π½Π΅ встрСчаСтся Π² Π½Π΅ΠΌ: эти Ρ‚Ρ€ΠΈ элСмСнта Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ ΠΈ вставлСны Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ мСста.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ do-primes с двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ для Π·Π°Ρ…Π²Π°Ρ‚Π° этого списка ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ &rest для Π·Π°Ρ…Π²Π°Ρ‚Π° Ρ„ΠΎΡ€ΠΌ Ρ‚Π΅Π»Π° Ρ†ΠΈΠΊΠ»Π°, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ список Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(defmacro do-primes (var-and-range &rest body)
Β Β (let ((var (first var-and-range))
Β Β Β Β Β Β Β Β (start (second var-and-range))
Β Β Β Β Β Β Β Β (end (third var-and-range)))
Β Β Β Β `(do ((,var (next-prime ,start) (next-prime (1+ ,var))))
Β Β Β Β Β Β Β Β Β ((> ,var ,end))
Β Β Β Β Β Β Β ,@body)))

ΠžΡ‡Π΅Π½ΡŒ скоро я объясню ΠΊΠ°ΠΊ Ρ‚Π΅Π»ΠΎ макроса Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ раскрытиС; сСйчас ΠΆΠ΅ Π²Π°ΠΌ слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ var, start ΠΈ end, каТдая содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½ΠΎΠ΅ ΠΈΠ· var-and-range, ΠΈ эти значСния Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ квазицитирования, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ раскрытиС do-primes.

Однако, Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ var-and-range Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² макроса являСтся Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ списком дСструктурируСмых ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ДСструктурированиС, ΠΊΠ°ΠΊ ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, осущСствляСт Ρ€Π°Π·Π±ΠΎΡ€ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ структуры, Π² нашСм случаС списочной структуры Ρ„ΠΎΡ€ΠΌ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… макросу.

Π’Π½ΡƒΡ‚Ρ€ΠΈ списка дСструктурируСмых ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² простоС имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ списком ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² Ρ‚Π°ΠΊΠΎΠΌ спискС Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ свои значСния ΠΈΠ· элСмСнтов выраТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ связано с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, Π·Π°ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΌ этим списком. НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ var-and-range списком (var start end) ΠΈ Ρ‚Ρ€ΠΈ элСмСнта списка Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски дСструктурированы Π² эти Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ списка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² макросов являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ &body ΠΊΠ°ΠΊ синоним &rest. БСмантичСски &body ΠΈ &rest эквивалСнты, Π½ΠΎ мноТСство срСд Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΊΡ‚ наличия ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° &body для измСнСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ использования макроса, поэтому ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ &body ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π·Π°Ρ…Π²Π°Ρ‚Π° списка Ρ„ΠΎΡ€ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ‚Π΅Π»ΠΎ макроса.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ макроса do-primes ΠΈ Π΄Π°Ρ‚ΡŒ подсказку (ΠΊΠ°ΠΊ людям, Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΌ ваш ΠΊΠΎΠ΄, Ρ‚Π°ΠΊ ΠΈ вашим инструмСнтам Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ) ΠΎΠ± Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ:

(defmacro do-primes ((var start end) &body body)
Β Β `(do ((,var (next-prime ,start) (next-prime (1+ ,var))))
Β Β Β Β Β Β Β ((> ,var ,end))
Β Β Β Β Β ,@body))

Π’ стрСмлСнии ΠΊ краткости список дСструктурируСмых ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт Π²Π°ΠΌ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ошибок: ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ do-primes, Lisp Π±ΡƒΠ΄Π΅Ρ‚ способСн ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π΅ являСтся трСхэлСмСнтным списком, ΠΈ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ Π²Π°ΠΌ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹Π΅ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… (ΠΊΠ°ΠΊ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ со слишком ΠΌΠ°Π»Ρ‹ΠΌ ΠΈΠ»ΠΈ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, слишком большим числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²). Π’Π°ΠΊΠΆΠ΅, срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ SLIME, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π²Π°ΠΌ ΠΊΠ°ΠΊΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚Π΅ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ макроса, ΠΏΡ€ΠΈ использовании Π²Π°ΠΌΠΈ списка дСструктурируСмых ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ способны Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ синтаксис Π²Ρ‹Π·ΠΎΠ²Π° макроса. Π‘ исходным ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ SLIME Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ do-primes вызываСтся ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(do-primes var-and-range &rest body)

Π‘ Π½ΠΎΠ²Ρ‹ΠΌ ΠΆΠ΅ описаниСм ΠΎΠ½Π° смоТСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(do-primes (var start end) &body body)

Бписки дСструктурируСмых ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ &optional, &key ΠΈ &rest, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ дСструктурируСмыС списки. Однако всС эти возмоТности Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ Π²Π°ΠΌ для написания do-primes.

ГСнСрация раскрытия

Π’Π°ΠΊ ΠΊΠ°ΠΊ do-primes являСтся довольно простым макросом, послС дСструктурирования Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², всё Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ остаётся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ β€” это ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π² шаблон для получСния раскрытия.

Для простых макросов, Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ do-primes, Π»ΡƒΡ‡ΡˆΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ являСтся использованиС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ синтаксиса квазицитирования. ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΎ говоря, выраТСния квазицитирования ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ выраТСниям цитирования, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ «Ρ€Π°ΡΠΊΠ°Π²Ρ‹Ρ‡ΠΈΡ‚ΡŒ» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ подвыраТСния, прСдваряя ΠΈΡ… запятой, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ слСдуСт Π·Π½Π°ΠΊ «at» (@). Π‘Π΅Π· этого Π·Π½Π°ΠΊΠ° «at» запятая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ значСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π½Π΅ΠΉ подвыраТСния. Π‘ΠΎ Π·Π½Π°ΠΊΠΎΠΌ «at» Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ списком, «Π²ΠΊΠ»Π΅ΠΈΠ²Π°Π΅Ρ‚ся» Π² ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰ΠΈΠΉ список.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΉ способ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ синтаксисС квазицитирования ΠΊΠ°ΠΊ ΠΎΠ± ΠΎΡ‡Π΅Π½ΡŒ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠΌ способС написания ΠΊΠΎΠ΄Π°, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ списки. Π’Π°ΠΊΠΎΠ΅ прСдставлСниС ΠΎ Π½Π΅ΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ прСимущСство, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ являСтся ΠΎΡ‡Π΅Π½ΡŒ Π±Π»ΠΈΠ·ΠΊΠΈΠΌ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ происходит «ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ»: ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° чтСния считываСт Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ квазицитирования, ΠΎΠ½Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π² ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΡΠΏΠΈΡΠΊΠΎΠ²ΡƒΡŽ структуру. НапримСр, `(,a b) вСроятно Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ ΠΊΠ°ΠΊ (list a ‘b). Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ языка Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ Π² точности ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° чтСния Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ списковыС структуры.

Π’Π°Π±Π»ΠΈΡ†Π° 8-1 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ квазицитирования вмСстС с эквивалСнтным ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΌ списки ΠΊΠΎΠ΄ΠΎΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ вычислСнии ΠΊΠ°ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ квазицитирования, Ρ‚Π°ΠΊ ΠΈ эквивалСнтного ΠΊΠΎΠ΄Π°2):

Π’Π°Π±Π»ΠΈΡ†Π° 8-1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ квазицитирования
Бинтаксис квазицитирования Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½Ρ‹ΠΉ ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΉ списки ΠΊΠΎΠ΄ Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
`(a (+ 1 2) c) (list ‘a ‘(+ 1 2) ‘c) (a (+ 1 2) c)
`(a ,(+ 1 2) c) (list ‘a (+ 1 2) ‘c) (a 3 c)
`(a (list 1 2) c) (list ‘a ‘(list 1 2) ‘c) (a (list 1 2) c)
`(a ,(list 1 2) c) (list ‘a (list 1 2) ‘c) (a (1 2) c)
`(a ,@(list 1 2) c) (append (list ‘a) (list 1 2) (list ‘c)) (a 1 2 c)

Π’Π°ΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ нотация квазицитирования являСтся просто удобством. Но это большоС удобство. Для ΠΎΡ†Π΅Π½ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, насколько ΠΎΠ½ΠΎ Π²Π΅Π»ΠΈΠΊΠΎ, сравнитС Π²Π΅Ρ€ΡΠΈΡŽ do-primes с ΠΊΠ²Π°Π·ΠΈΡ†ΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ вСрсиСй, которая явно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΉ списки ΠΊΠΎΠ΄:

(defmacro do-primes-a ((var start end) &body body)
Β Β (append '(do)
Β Β Β Β Β Β Β Β Β Β (list (list (list var
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β (list 'next-prime start)
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β (list 'next-prime (list '1+ var)))))
Β Β Β Β Β Β Β Β Β Β (list (list (list '> var end)))
Β Β Β Β Β Β Β Β Β Β body))

Как Π²Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ скоро ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, тСкущая рСализация do-primes Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Π΅ случаи. Но ΠΏΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, β€” это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для исходного ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это двумя способами. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ косвСнно ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свою Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ просто воспользовавшись Сю (подразумСвая, Ρ‡Ρ‚ΠΎ Ссли ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, Ρ‚ΠΎ ΠΈ раскрытиС Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ). НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ исходный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования do-primes Π² REPL ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈ Π² самом Π΄Π΅Π»Π΅ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ простых чисСл.

CL-USER> (do-primes (p 0 19) (format t "~d " p))
2 3 5 7 11 13 17 19
NIL

Или ΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ макрос Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, посмотрСв Π½Π° раскрытиС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. Ѐункция MACROEXPAND-1 ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ любоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Lisp Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ осущСствлСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ шага раскрытия макроса3). Π’Π°ΠΊ ΠΊΠ°ΠΊ MACROEXPAND-1 являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, для дословной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ макроса Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Ρ†ΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ„ΠΎΡ€ΠΌΡƒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ MACROEXPAND-1 для просмотра раскрытия ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°4).

CL-USER> (macroexpand-1 '(do-primes (p 0 19) (format t "~d " p)))
(DO ((P (NEXT-PRIME 0) (NEXT-PRIME (1+ P))))
((> P 19))
(FORMAT T "~d " P))
T

Π’Π°ΠΊΠΆΠ΅, для большСго удобства, Π² SLIME Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ раскрытиС макроса помСстив курсор Π½Π° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ скобку Ρ„ΠΎΡ€ΠΌΡ‹ макроса Π² вашСм исходном ΠΊΠΎΠ΄Π΅ ΠΈ Π½Π°Π±Ρ€Π°Π² C-c RET для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Emacs slime-macroexpand-1, которая пСрСдаст Ρ„ΠΎΡ€ΠΌΡƒ макроса Π² MACROEXPAND-1 ΠΈ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ раскрытия макроса совпадаСт с исходным (написанным Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ) раскрытиСм, ΠΈ поэтому каТСтся, Ρ‡Ρ‚ΠΎ do-primes Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

УстранСниС ΠΏΡ€ΠΎΡ‚Π΅Ρ‡Π΅ΠΊ

Π’ своСм эссС «Π—Π°ΠΊΠΎΠ½ дырявых абстракций» ДТоэл Бпольски ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π» Ρ‚Π΅Ρ€ΠΌΠΈΠ½ «Π΄Ρ‹Ρ€ΡΠ²ΠΎΠΉ абстракции» для описания Ρ‚Π°ΠΊΠΎΠΉ абстракции, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ «ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°ΡŽΡ‚» Π΄Π΅Ρ‚Π°Π»ΠΈ, абстрагированиС ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… прСдполагаСтся. Π’Π°ΠΊ ΠΊΠ°ΠΊ написаниС макроса β€” это способ создания абстракции, Π²Π°ΠΌ слСдуСт ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ваш макрос излишнС Π½Π΅ «ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°Π΅Ρ‚»5)

Как оказываСтся, Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ «ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°Ρ‚ΡŒ» Ρ‡Π΅Ρ€Π΅Π· макросы трСмя способами. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, довольно Π»Π΅Π³ΠΊΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ мСсто ΠΎΠ΄Π½Π° ΠΈΠ· Ρ‚Ρ€Π΅Ρ… этих возмоТностСй, ΠΈ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ….

Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ страдаСт ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡Π΅ΠΊ» макросов, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ½ΠΎ вычисляСт ΠΏΠΎΠ΄Ρ„ΠΎΡ€ΠΌΡƒ end слишком ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²Ρ‹Π·Π²Π°Π»ΠΈ do-primes с Ρ‚Π°ΠΊΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠ°ΠΊ (random 100), Π½Π° мСстС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° end вмСсто использования числового Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°, Ρ‚Π°ΠΊΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ 19.

(do-primes (p 0 (random 100))
Β Β (format t "~d " p))

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡ‹ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ здСсь являСтся ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ простым числам ΠΎΡ‚ нуля Π΄ΠΎ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ случайного простого числа, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ (random 100). Однако, это Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ тСкущая рСализация, ΠΊΠ°ΠΊ это ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ MACROEXPAND-1.

CL-USER> (macroexpand-1 '(do-primes (p 0 (random 100)) (format t "~d " p)))
(DO ((P (NEXT-PRIME 0) (NEXT-PRIME (1+ P))))
Β Β Β Β ((> P (RANDOM 100)))
Β Β (FORMAT T "~d " P))
T

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

Π­Ρ‚ΠΎ являСтся «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠΎΠΉ» абстракции, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ использования макроса, Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ освСдомлСн ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ° end Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°. Одним ΠΈΠ· способов устранСния этой «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠΈ» являСтся простоС спСцифицированиС Π΅Π΅ ΠΊΠ°ΠΊ повСдСния do-primes. Но это Π½Π΅ достаточно ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ: ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ макросов Π²Π°ΠΌ слСдуСт ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ НаимСньшСго УдивлСния. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ программисты ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ макросам, Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ Π½Π΅ большСС число Ρ€Π°Π·, Ρ‡Π΅ΠΌ это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ6). Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ do-primes построСна Π½Π° основС ΠΌΠΎΠ΄Π΅Π»ΠΈ стандартных макросов DOTIMES ΠΈ DOLIST, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ всС свои Ρ„ΠΎΡ€ΠΌΡ‹, ΠΊΡ€ΠΎΠΌΠ΅ Ρ„ΠΎΡ€ΠΌ Ρ‚Π΅Π»Π°, Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ программистов Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΎΡ‚ do-primes ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ повСдСния.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ мноТСствСнноС вычислСниС достаточно Π»Π΅Π³ΠΊΠΎ: Π²Π°ΠΌ просто слСдуСт ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вычисляСт end ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈ сохраняСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ для дальнСйшСго использования. Вспомним, Ρ‡Ρ‚ΠΎ Π² Ρ†ΠΈΠΊΠ»Π΅ DO ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с Ρ„ΠΎΡ€ΠΌΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π±Π΅Π· Ρ„ΠΎΡ€ΠΌΡ‹ вычислСния ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ мноТСствСнных вычислСний ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ:

(defmacro do-primes ((var start end) &body body)
Β Β `(do ((ending-value ,end)
Β Β Β Β Β Β Β Β (,var (next-prime ,start) (next-prime (1+ ,var))))
Β Β Β Β Β Β Β ((> ,var ending-value))
Β Β Β Β Β ,@body))

К соТалСнию Π΄Π°Π½Π½ΠΎΠ΅ исправлСниС Π²Π²ΠΎΠ΄ΠΈΡ‚ Π΄Π²Π΅ Π½ΠΎΠ²Ρ‹Π΅ «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠΈ» Π² ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅ΠΌΡƒΡŽ нашим макросом Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ.

Одна ΠΈΠ· этих «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡Π΅ΠΊ» ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ мноТСствСнных вычислСний, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ исправили. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»Π° DO Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° раскрытиС макроса вычисляСтся, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ ΠΊΠ°ΠΊ end, Π±ΡƒΠ΄Π΅Ρ‚ вычислСно ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ°ΠΊ start, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΈΠ΄ΡƒΡ‚ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ макроса. Π­Ρ‚Π° «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠ°» Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΠΊΠ° start ΠΈ end ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°ΠΌΠΈ Π²Ρ€ΠΎΠ΄Π΅ 0 ΠΈ 19. Но, Ссли ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты, вычислСниС ΠΈΡ… Π² Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС снова Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ НаимСньшСго УдивлСния.

Π­Ρ‚Π° «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠ°» устраняСтся Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡƒΡ‚Π΅ΠΌ измСнСния порядка опрСдСлСния Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

(defmacro do-primes ((var start end) &body body)
Β Β `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
Β Β Β Β Β Β Β Β (ending-value ,end))
Β Β Β Β Β Β Β ((> ,var ending-value))
Β Β Β Β Β ,@body))

ПослСдняя «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠ°», ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ, Π±Ρ‹Π»Π° создана использованиСм ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ending-value. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ имя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π΄Π΅Ρ‚Π°Π»ΡŒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ макроса, ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ Π²ΠΎ взаимодСйствиС с ΠΊΠΎΠ΄ΠΎΠΌ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ макросу, ΠΈΠ»ΠΈ с контСкстом, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ макрос вызываСтся. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ, каТущийся Π²ΠΏΠΎΠ»Π½Π΅ допустимым, Π²Ρ‹Π·ΠΎΠ² do-primes Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΠ·-Π·Π° Π΄Π°Π½Π½ΠΎΠΉ «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠΈ»:

(do-primes (ending-value 0 10)
Β Β (print ending-value))

Π’ΠΎ ΠΆΠ΅ касаСтся ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°:

(let ((ending-value 0))
Β Β (do-primes (p 0 10)
Β Β Β Β (incf ending-value p))
Β Β ending-value)

И снова MACROEXPAND-1 ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Π² Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

(do ((ending-value (next-prime 0) (next-prime (1+ ending-value)))
Β Β Β Β Β (ending-value 10))
Β Β Β Β ((> ending-value ending-value))
Β Β (print ending-value))

НСкоторыС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Lisp ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π²Π΅Ρ€Π³ΡƒΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ending-value ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Π²Π°ΠΆΠ΄Ρ‹ Π² качСствС ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ-ΠΆΠ΅ Ρ†ΠΈΠΊΠ»Π° DO. Если ΠΆΠ΅ этого Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ρ‚ΠΎ ΠΊΠΎΠ΄ зациклится, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ending-value Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ станСт большС сСбя самого.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(let ((ending-value 0))
Β Β (do ((p (next-prime 0) (next-prime (1+ p)))
Β Β Β Β Β Β Β (ending-value 10))
Β Β Β Β Β Β ((> p ending-value))
Β Β Β Β (incf ending-value p))
Β Β ending-value)

Π’ этом случаС сгСнСрированный ΠΊΠΎΠ΄ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ допустим, Π½ΠΎ Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ совсСм Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Π°ΠΌ. Π’Π°ΠΊ ΠΊΠ°ΠΊ привязка ending-value, установлСнная с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ LET снаруТи Ρ†ΠΈΠΊΠ»Π° пСрСкрываСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ DO, Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ° (incf ending-value p) ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ†ΠΈΠΊΠ»Π° ending-value вмСсто внСшнСй ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, создавая Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π΅Ρ‡Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ»7).

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ для устранСния этой «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠΈ» β€” это символ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ снаруТи ΠΊΠΎΠ΄Π°, сгСнСрированного макросом. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ маловСроятный символ, Π½ΠΎ это всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ даст Π²Π°ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ сСбя Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стСпСни ΠΏΡƒΡ‚Π΅ΠΌ использования ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², описанных Π² Π³Π»Π°Π²Π΅ 21. Но сущСствуСт Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

Ѐункция GENSYM Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ символ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ своСм Π²Ρ‹Π·ΠΎΠ²Π΅. Π’Π°ΠΊΠΎΠΉ символ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π΄ΠΎ этого Π½Π΅ Π±Ρ‹Π» ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ чтСния Lisp ΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½ (isn’t interned) Π½ΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ‚, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ Сю. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, вмСсто использования Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ending-value, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ символ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ раскрытии do-primes.

(defmacro do-primes ((var start end) &body body)
Β Β (let ((ending-value-name (gensym)))
Β Β Β Β `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
Β Β Β Β Β Β Β Β Β Β (,ending-value-name ,end))
Β Β Β Β Β Β Β Β Β ((> ,var ,ending-value-name))
Β Β Β Β Β Β Β ,@body)))

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ GENSYM Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ раскрытия; ΠΎΠ½ запускаСтся ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ раскрытия макроса ΠΈ поэтому создаСт Π½ΠΎΠ²Ρ‹ΠΉ символ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ раскрытии макроса. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСсколько странным сначала: ending-value-name являСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‡ΡŒΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Но Π½Π° самом Π΄Π΅Π»Π΅ Ρ‚ΡƒΡ‚ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΉ ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° var, Ρ‡ΡŒΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ЕдинствСнная Ρ€Π°Π·Π½ΠΈΡ†Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ var Π±Ρ‹Π»ΠΎ создано ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ чтСния, ΠΊΠΎΠ³Π΄Π° Ρ„ΠΎΡ€ΠΌΠ° макроса Π±Ρ‹Π»Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π°, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ending-value-name Π±Ρ‹Π»ΠΎ сгСнСрированно ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΏΡ€ΠΈ запускС ΠΊΠΎΠ΄Π° макроса.

Π‘ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄Π²Π΅ Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ. ΠŸΠ΅Ρ€Π²Π°Ρ Ρ„ΠΎΡ€ΠΌΠ°:

(do-primes (ending-value 0 10)
Β Β (print ending-value))

Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

(do ((ending-value (next-prime 0) (next-prime (1+ ending-value)))
Β Β Β Β Β (#:g2141 10))
Β Β Β Β ((> ending-value #:g2141))
Β Β (print ending-value))

Π’Π΅ΠΏΠ΅Ρ€ΡŒ пСрСмСнная, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ для хранСния ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ значСния являСтся сгСнСрированным Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ gensym символом, #:g2141. Имя ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, G2141, Π±Ρ‹Π»ΠΎ сгСнСрировано с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GENSYM, Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ Π½Π΅ это; Π²Π°ΠΆΠ½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ символы ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ синтаксисС для Π½Π΅ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… символов: с Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ #:.

Вторая Ρ€Π°Π½Π΅Π΅ проблСмная Ρ„ΠΎΡ€ΠΌΠ°:

(let ((ending-value 0))
Β Β (do-primes (p 0 10)
Β Β Β Β (incf ending-value p))
Β Β ending-value)

послС Π·Π°ΠΌΠ΅Π½Ρ‹ do-primes Π΅Π³ΠΎ раскрытиСм Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(let ((ending-value 0))
Β Β (do ((p (next-prime 0) (next-prime (1+ p)))
Β Β Β Β Β Β Β (#:g2140 10))
Β Β Β Β Β Β ((> p #:g2140))
Β Β Β Β (incf ending-value p))
Β Β ending-value)

И снова, Ρ‚ΡƒΡ‚ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠΈ», Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ пСрСмСнная ending-value, связанная ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ Ρ†ΠΈΠΊΠ» do-primes Ρ„ΠΎΡ€ΠΌΠΎΠΉ LET, большС Π½Π΅ пСрСкрываСтся Π½ΠΈΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Π² ΠΊΠΎΠ΄Π΅ раскрытия.

НС всС Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² раскрытии макросов, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·ΠΎΠ²ΡƒΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ; ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅Ρ‚Π΅ большС ΠΎΠΏΡ‹Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ, Π²Ρ‹ смоТСтС ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ Π»ΠΈ использованиС Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ мСстС ΠΊ «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠ΅» Π² прСдоставляСмой макросом абстракции. Но Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² использовании сгСнСрированных ΠΈΠΌΠ΅Π½ Π²Π΅Π·Π΄Π΅ для увСрСнности.

Π­Ρ‚ΠΈΠΌ исправлСниСм ΠΌΡ‹ устранили всС «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠΈ» Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ do-primes. ПослС получСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΏΡ‹Ρ‚Π° Π² написании макросов, Π²Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ макросы с Π·Π°Ρ€Π°Π½Π΅Π΅ устранСнными «ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠ°ΠΌΠΈ» Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π°. На самом Π΄Π΅Π»Π΅ это довольно просто, Ссли Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ:

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

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠ΅ макросы

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

На самом Π΄Π΅Π»Π΅, Π²Ρ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΎΠ΄ΠΈΠ½ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±Ρ€Π°Π·Π΅Ρ†: ΠΌΠ½ΠΎΠ³ΠΈΠ΅ макросы, ΠΊΠ°ΠΊ ΠΈ послСдняя вСрсия do-primes, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с LET, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π²ΠΎΠ΄ΠΈΡ‚ нСсколько ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, содСрТащих сгСнСрированныС символы для использовании Π² раскрытии макроса. Π’Π°ΠΊ ΠΊΠ°ΠΊ это ΠΎΠ±Ρ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π·Π΅Ρ†, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π°ΠΌ Π½Π΅ Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΅Π³ΠΎ собствСнного макроса?

Π’ этой сСкции Π²Ρ‹ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ макрос with-gensyms, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ это. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π²Ρ‹ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ макрос, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΉ макрос: макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ слоТныС макросы, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠ΅ макросы, ΠΌΠΎΠ³ΡƒΡ‚ слСгка ΡΠ±ΠΈΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ½Π΅Ρ‚Π΅ ΠΊ Π»Π΅Π³ΠΊΠΎΠΌΡƒ ΡƒΠΌΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ уровнями ΠΊΠΎΠ΄Π°, with-gensyms довольно прямолинССн ΠΈ послуТит ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΈ, Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΌ Π½Π΅ΠΏΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… умствСнных усилий ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ΠΌ.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅:

(defmacro do-primes ((var start end) &body body)
Β Β (with-gensyms (ending-value-name)
Β Β Β Β `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
Β Β Β Β Β Β Β Β Β Β (,ending-value-name ,end))
Β Β Β Β Β Β Β Β Β ((> ,var ,ending-value-name))
Β Β Β Β Β Β Β ,@body)))

ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ do-primes, эквивалСнтный Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсии. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, with-gensyms Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² LET, которая связываСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ending-value-name Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, со сгСнСрированным символом. Достаточно просто Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простого шаблона-квазитирования.

(defmacro with-gensyms ((&rest names) &body body)
Β Β `(let ,(loop for n in names collect `(,n (gensym)))
Β Β Β Β Β ,@body))

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΏΡΡ‚ΡƒΡŽ для подстановки значСния выраТСния LOOP. Π­Ρ‚ΠΎΡ‚ Ρ†ΠΈΠΊΠ» Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ список ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Ρ„ΠΎΡ€ΠΌ, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… состоит ΠΈΠ· списка, содСрТащСго ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… with-gensyms ΠΈΠΌΠ΅Π½, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ (gensym). Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ сгСнСрируСт Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ LOOP Π² REPL, Π·Π°ΠΌΠ΅Π½ΠΈΠ² names списком символов.

CL-USER> (loop for n in '(a b c) collect `(,n (gensym)))
((A (GENSYM)) (B (GENSYM)) (C (GENSYM)))

ПослС списка ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Ρ„ΠΎΡ€ΠΌ Π² качСствС Ρ‚Π΅Π»Π° LET вклСиваСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ body with-gensyms. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΠ· ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚Π΅ Π² with-gensyms, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° любоС ΠΈΠ· ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ· списка ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ with-gensyms.

Если Π²Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ macro-expand для Ρ„ΠΎΡ€ΠΌΡ‹ with-gensyms Π² Π½ΠΎΠ²ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ do-primes, Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅:

(let ((ending-value-name (gensym)))
Β Β `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
Β Β Β Β Β Β Β Β (,ending-value-name ,end))
Β Β Β Β Β Β Β ((> ,var ,ending-value-name))
Β Β Β Β Β ,@body))

Выглядит Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ. Π₯отя этот макрос довольно прост, ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ясно ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ макросы Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ: ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ DEFMACRO do-primes, Ρ„ΠΎΡ€ΠΌΠ° with-gensyms раскрываСтся Π² ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π²ΠΈΠ΄Π΅Π»ΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, скомпилированная вСрсия do-primes Π² точности такая ΠΆΠ΅, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Π²Ρ‹ написали внСшний LET Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Когда Π²Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ do-primes, Ρ‚ΠΎ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ do-primes запускаСтся ΠΊΠΎΠ΄, сгСнСрированный with-gensyms, Π½ΠΎ сам with-gensyms ΠΏΡ€ΠΈ компиляции Ρ„ΠΎΡ€ΠΌΡ‹ do-primes Π½Π΅ Π½ΡƒΠΆΠ΅Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΡƒΠΆΠ΅ Π±Ρ‹Π» раскрыт ΠΏΡ€ΠΈ компиляции do-primes.

Π”Ρ€ΡƒΠ³ΠΎΠΉ классичСский макрос, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΉ макросы: ONCE-ONLY

Π”Ρ€ΡƒΠ³ΠΈΠΌ классичСским макросом, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΌ макросы, являСтся once-only, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ макроса Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ ΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ порядкС. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ once-only Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ do-primes ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ простым способом, ΠΊΠ°ΠΊ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ «ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°ΡŽΡ‰ΡƒΡŽ» Π²Π΅Ρ€ΡΠΈΡŽ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(defmacro do-primes ((var start end) &body body)
Β Β (once-only (start end)
Β Β Β Β `(do ((,var (next-prime ,start) (next-prime (1+ ,var))))
Β Β Β Β Β Β Β Β Β ((> ,var ,end))
Β Β Β Β Β Β Β ,@body)))

Однако, рСализация once-only нСсколько Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Π° для ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ пошагового объяснСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ зависит ΠΎΡ‚ мноТСства ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ квазицитирования ΠΈ «Ρ€Π°ΡΠΊΠ°Π²Ρ‹Ρ‡ΠΈΠ²Π°Π½ΠΈΡ». Если Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ макросов, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠœΠ°ΠΊΡ€ΠΎΡ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(defmacro once-only ((&rest names) &body body)
Β Β (let ((gensyms (loop for n in names collect (gensym))))
Β Β Β Β `(let (,@(loop for g in gensyms collect `(,g (gensym))))
Β Β Β Β Β Β `(let (,,@(loop for g in gensyms for n in names collect ``(,,g ,,n)))
Β Β Β Β Β Β Β Β ,(let (,@(loop for n in names for g in gensyms collect `(,n ,g)))
Β Β Β Β Β Β Β Β Β Β Β ,@body)))))

НС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ простыС макросы

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

ΠœΠ°ΠΊΡ€ΠΎΡ Π½Π° языкС C

ΠœΠ°ΠΊΡ€ΠΎΡ Π½Π° языкС C — это Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ присвоСно имя. Когда имя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ макроса замСняСтся ΠΏΠ΅Ρ€Π΅Π΄ компиляциСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрим, ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ макрос Π½Π° языкС C.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

START

Π¦Π•Π›ΠžΠ• n = 5;

PRINT (Β«Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n Ρ€Π°Π²Π½ΠΎ% dΒ», n);

ΠšΠžΠΠ•Π¦

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄ Π½Π΅ являСтся допустимым ΠΊΠΎΠ΄ΠΎΠΌ C.

Но допустим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€1.c
#define START int main () {
#define END}
#define INTEGER int
#define PRINT (A, B) printf (A, B)

START

INTEGER n = 5;

PRINT (Β«Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n Ρ€Π°Π²Π½ΠΎ% dΒ», n);

ΠšΠžΠΠ•Π¦

ΠŸΠ΅Ρ€Π΅Π΄ компиляциСй макросы START, INTEGER, PRINT ΠΈ END Π±Ρ‹Π»ΠΈ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΈΡ… значСниями, ΠΈ ΠΊΠΎΠ΄ стал допустимым ΠΊΠΎΠ΄ΠΎΠΌ C. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° отобразится послС раскрытия всСх макросов.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ макросов:

1.ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°:

Бинтаксис:

#define macro_name macro_value

  • ΠœΠ°ΠΊΡ€ΠΎΡ всСгда начинаСтся с #define
  • macro_name — опрСдСляСмоС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ имя макроса
  • macro_value — Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ макроса. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, Π½ΠΎ ΠΎΠ΄Π½Π° строка ΠΈ Ρ‚Π΅Π»ΠΎ макроса Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ†Π°ΠΌΠΈ этой строки. НС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ с запятой (;) Π² ΠΊΠΎΠ½Ρ†Π΅. Π’Π°ΠΊΠΆΠ΅ учитываСтся пространство.

Если макрос Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ строки, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

#define macro_name macro_value1 \
macro_value2 \
macro_value3

#define MAX 200

Π­Ρ‚ΠΎΡ‚ макрос выглядит ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, поэтому макрос этого Ρ‚ΠΈΠΏΠ° называСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ макросом.

//Example2.c
// # include
#define MAX 200

int main ()
{
printf («ΠœΠΠšΠ‘Π˜ΠœΠΠ›Π¬ΠΠžΠ• Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:% d», МАКБ);
Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;
}

Π’ Exapmle2.c MAX — это макрос. Из Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ MAX замСняСтся своим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 200 .

2. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ макросы:

Бинтаксис:

#define имя_макроса () Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅_макроса

имя_макроса — опрСдСляСмоС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ имя макроса.ΠŸΠ°Ρ€Π° скобок Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ поставлСна ​​послС macro_name . ΠœΠ΅ΠΆΠ΄Ρƒ macro_name ΠΈ ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΌΠΈ скобками Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ². ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² этом Ρ‚ΠΈΠΏΠ΅ макросов.

Π­Ρ‚ΠΎΡ‚ макрос выглядит ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, поэтому макрос этого Ρ‚ΠΈΠΏΠ° называСтся макросом, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

//Example3.c

#define add (x, y) x + y

int main ()
{

int a;
float b;

a = Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (4,5);
b = Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (2.5,3.6)

Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;
}

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Example3.c ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ C, макрос замСняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π½Π΅ вычисляя Π΅Π³ΠΎ. Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ макрос.

Если ΠΌΡ‹ помСстим ΠΏΡ€ΠΎΠ±Π΅Π» ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌΠ΅Π½Π΅ΠΌ макроса ΠΈ ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΌΠΈ скобками, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ макрос. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ C, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ это.

//Example4.c

#define add (x, y) x + y

int main ()
{

int a;
float b;

a = Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (4,5);
b = Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (2.5,3.6)
}

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 4 .c ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ макрос add Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° (x, y) x + y. Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ макрос.

3. ΠœΠ°ΠΊΡ€ΠΎΡ для вставки Ρ‚ΠΎΠΊΠ΅Π½Π°:
Π’ языкС C для вставки Ρ‚ΠΎΠΊΠ΅Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ##. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π΄Π²Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΎΠΊΠ΅Π½Π° Π² ΠΎΠ΄ΠΈΠ½ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

//Example5.c
#define MARGE (x, y) x ## y

int main ()
{

int num = MARGE (52,34);
Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;
}

Если ΠΌΡ‹ попытаСмся Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ сгСнСрируСт Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½, компилятор C выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.

//Example6.c
#define MARGE (x, y) x ## y

int main ()
{

int num = MARGE (52, +);
Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;
}

Π’ Example6.c Ρƒ нас Π΅ΡΡ‚ΡŒ сообщСниС ΠΎΠ± ошибкС, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ послС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π΄Π²ΡƒΡ… Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ нСдопустимый Ρ‚ΠΎΠΊΠ΅Π½ ’52 + ’.

4. ΠœΠ°ΠΊΡ€ΠΎΡ для прСобразования строк:
Π’ языкС C ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСобразования ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° макроса Π² ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ константу. Когда ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ # ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ макроса, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ прСобразуСтся Π² строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π».Π‘Ρ‚Ρ€ΠΈΠ½Π³ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для макросов ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ….
ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

//Example7.c
#define STRINGIZING (x) #x

int main ()
{

printf (STRINGIZING (ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€));
Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;
}

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Example7.c Ρƒ нас Π΅ΡΡ‚ΡŒ строка Β«Hello WorldΒ» с использованиСм макроса STRINGIZING.

Π’Ρ‹Π²ΠΎΠ΄:

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎΠ±ΠΎ всСх Ρ‚ΠΈΠΏΠ°Ρ… макросов ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… макросов , Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… макросов , ΠœΠ°ΠΊΡ€ΠΎ для вставки Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² , ΠœΠ°ΠΊΡ€ΠΎ для создания строк ΠΈ макросов для Π½Π° языкС C.Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π±Π΅Π· всяких сомнСний ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макрос Π² нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° языкС C.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы Π² C

Одно странноС явлСниС ΠΏΡ€ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° C — использованиС макросов.

Π­Ρ‚ΠΎ Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² соврСмСнных языках программирования (ΠΊΡ€ΠΎΠΌΠ΅ C ++). И для этого Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°.

ИспользованиС макросов ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΡ€Π°ΠΉΠ½Π΅ нСбСзопасным, ΠΈ ΠΎΠ½ΠΈ ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ мноТСство ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΊΠ°ΠΌΠ½Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π½Π°ΠΉΡ‚ΠΈ. Однако, ΠΊΠ°ΠΊ программист Π½Π° C ΠΈΠ»ΠΈ C ++, Π²Ρ‹ Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ с макросами Π² своСй ΠΆΠΈΠ·Π½ΠΈ кодирования.Π”Π°ΠΆΠ΅ Ссли Π²Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΈΡ… Π² своСм собствСнном ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, Π²Π΅Π»ΠΈΠΊΠ° Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ встрСтитС ΠΈΡ… Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΅Ρ‰Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅.

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

Когда я Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ познакомился с макросами, ΠΎΠ½ΠΈ казались ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρƒ Π½ΠΈΡ… Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ странный синтаксис, Π½ΠΎ ΠΎΠ½ΠΈ Β«Π²Π΅Π΄ΡƒΡ‚ сСбя» ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ΠΎΠ³Π΄Π° Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π°?

Ну, макросы — это функция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ тСкста . ПослС сборки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ всС вхоТдСния макроса Β«Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡΒ» ΠΈ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ опрСдСлСниями макросов.

Как это выглядит?

прСобразуСтся Π²

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΊΠΎΠ³Π΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ, для Π½ΠΈΡ… выдСляСтся Π½ΠΎΠ²Ρ‹ΠΉ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ стСковый Ρ„Ρ€Π΅ΠΉΠΌ, ΠΈ ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ нСзависимо ΠΎΡ‚ мСста, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π²Ρ‹Π·Π²Π°Π½Ρ‹.

Если Π²Ρ‹ опрСдСляСтС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ var Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ foo, ΠΈ ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bar , которая опрСдСляСт свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ var , Ρ‚ΠΎ ошибки Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ пСрСмСнная, опрСдСлСнная Π² bar , отличаСтся ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π² foo .

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ макроса, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ пСрСмСнная, опрСдСлСнная Π² макросС, Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ другая пСрСмСнная:

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли функция ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ строку, Π½ΠΎ Π²Ρ‹ Π΄Π°Π΅Ρ‚Π΅ Π΅ΠΉ int, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ (ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Π² зависимости ΠΎΡ‚ компилятора).

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹, ΠΎΠ΄Π½Π°ΠΊΠΎ, просто Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅.

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, макросы Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π»Π°ΠΆΠ΅Π½Ρ‹ . Когда Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π΅ пошагово. ΠœΠ°ΠΊΡ€ΠΎΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚.

Π˜Ρ‚Π°ΠΊ, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΄Π΅-Ρ‚ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, СдинствСнный способ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Π² Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, — это ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ.

Π•ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ прСимущСство использования макросов ΠΏΠ΅Ρ€Π΅Π΄ функциями — ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ.

ΠœΠ°ΠΊΡ€ΠΎΡ быстрСС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
Как я ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π», ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.Π­Ρ‚ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² стСкС, ΠΈ это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹
Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π°ΠΊΠΈΡ… Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов.

Π­Ρ‚ΠΎ прСимущСство ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ большоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² систСмС с высокими ограничСниями. НапримСр, ΠΎΡ‡Π΅Π½ΡŒ старый ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€.
Но Π΄Π°ΠΆΠ΅ сСйчас программисты Π΄Π΅Π»Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ макросы для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€.

Однако для этого Π΅ΡΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° Π² C99 ΠΈ C ++ — это встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ .
Когда Π²Ρ‹ добавляСтС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово inline ΠΏΠ΅Ρ€Π΅Π΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, Π²Ρ‹ Π½Π°ΠΌΠ΅ΠΊΠ°Π΅Ρ‚Π΅ компилятору Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ макрос).
Но Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²ΠΎ встроСнных функциях, Ρ‚Π°ΠΊ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π»Π°ΠΆΠ΅Π½Ρ‹ . И Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ².
Однако ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово inline — это просто подсказка для компилятора, это Π½Π΅ строгоС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту подсказку.
Но Π² gcc Π΅ΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ( always_inline ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ заставляСт компилятор Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — отличная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, которая Π΄Π΅Π»Π°Π΅Ρ‚ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ макросов.
Однако Π΅ΡΡ‚ΡŒ Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… нСльзя Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π’

C ++ Π΅ΡΡ‚ΡŒ довольно интСрСсная функция, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Ρ‚ Π² C. Π­Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Ρƒ вас Π΅ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎ ТСланию:

Однако этого Π½Π΅Ρ‚ Π² C. Но Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊΠΎΠ³ΠΎ макроса:

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ довольно бСзопасСн ΠΈ Π½Π΅ скрываСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π»ΠΎΠ²ΡƒΡˆΠ΅ΠΊ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ обсудим.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ Π½Π΅Ρ‚ нСобходимости ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ этого.ΠœΠ°ΠΊΡ€ΠΎΡ достаточно.

ИспользованиС строк ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ

НСкоторыС компиляторы ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ строки ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ‚Π°ΠΊ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ ΠΏΡ€ΠΈ использовании Π² функциях: __FILE__, __LINE__, __func__ .

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ строку ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ , Π° Π½Π΅ строку Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π΅Π΅ Π²Ρ‹Π·Π²Π°Π»Π°. Π’ΠΎ ΠΆΠ΅ самоС ΠΈ с __func__ .

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для опрСдСлСния макросов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ вашСго ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

На самом Π΄Π΅Π»Π΅ это довольно ΠΊΡ€ΡƒΡ‚ΠΎΠΉ способ протоколирования Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ происходит, ΠΈ я часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π΅Π³ΠΎ Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… C.

ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ синтаксиса

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ мощная функция макросов. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΡ…, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой собствСнный синтаксис.

НапримСр, Π² C. Π½Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ foreach .
Но Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ макросы.

Π—Π΄Π΅ΡΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ структура связанного списка. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΡƒΠ·Π»Π°ΠΌΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π΅Π³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ LIST_FOREACH , Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ использовали Π±Ρ‹ foreach Π² соврСмСнных языках, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ C #.

Π­Ρ‚Π° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ мощная ΠΈ ΠΏΡ€ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ использовании ΠΌΠΎΠΆΠ΅Ρ‚ принСсти Π½Π΅ΠΏΠ»ΠΎΡ…ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Catch Test Framework.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² прСпроцСссора

Помимо макросов, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹.

Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ…:

#include — Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ содСрТимоС Ρ„Π°ΠΉΠ»Π° Π² ваш Ρ„Π°ΠΉΠ»
#ifdef — условная компиляция
#define — ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния констант Π² C.

#ifdef ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ создании Ρ„Π°ΠΉΠ»ΠΎΠ² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ².Π­Ρ‚ΠΎΡ‚ макрос ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ„Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π±Ρ‹Π» Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·:

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, #ifdef ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для условной компиляции Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π° Π½Π° основС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ условия. ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ:

#define для констант довольно ΠΏΠΎΠ»Π΅Π·Π΅Π½, хотя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΡΡ‚Π°Ρ€Π°ΡŽΡ‚ΡΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, замСняя Π΅Π³ΠΎ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ const ΠΈ пСрСчислСния .

Однако Ρƒ использования любой ΠΈΠ· этих Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ² Π΅ΡΡ‚ΡŒ нСдостатки.

const ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ макроконстант, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌΠΈ выполняСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ². Однако Π² C, это Π½Π΅ настоящиС константы.
НапримСр, Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ switch-case ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для опрСдСлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° статичСского массива.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π’ C ++ константныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ константами (Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ случаях), ΠΈ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… вмСсто констант #define .

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ , с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ константами. Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… switch-case ΠΈ для опрСдСлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива.
Однако ΠΈΡ… нСдостаток Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ†Π΅Π»Ρ‹Π΅ числа. Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для строковых констант ΠΈ констант с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой.
Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ, Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², константы #define — ваш СдинствСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ способ создания констант Π² вашСм ΠΊΠΎΠ΄Π΅.

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡ‚Π΅, макросы всС Π΅Ρ‰Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… контСкстах.

Но Ссли придСтся ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ — Π±ΡƒΠ΄ΡŒΡ‚Π΅ остороТны!

Π›ΠΎΠ²ΡƒΡˆΠΊΠ° 1: Π½Π΅ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ скобки

Бамая распространСнная ошибка, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я Π²ΠΈΠ΄Π΅Π» ΠΏΡ€ΠΈ использовании макросов, — это Π·Π°Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² скобки Π² опрСдСлСниях макросов.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°?

Ну, Π²Ρ‹Π·ΠΎΠ²Ρ‹ макросов ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ прямо Π² ваш ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ довольно нСприятныС ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты ΠΈΠ·-Π·Π° ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°!

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ пытаСмся ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ MULTIPLY (x + 5) , Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ привСсти ΠΊ 50.ВмСсто этого ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ 30.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° этого Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ макросы Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ тСкст Π²Π½ΡƒΡ‚Ρ€ΠΈ нашСго ΠΊΠΎΠ΄Π°. Π˜Ρ‚Π°ΠΊ, послС подстановки ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ:

ΠΠ•Π‘ΠšΠžΠ›Π¬ΠšΠž (x + 5) -> (x + 5 * 5)

И, ΠΊΠ°ΠΊ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ слоТСниСм. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Как это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ?

Π›ΠΎΠ²ΡƒΡˆΠΊΠ° 2: ИспользованиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ увСличСния / ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ

Иногда, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ вСсти сСбя ΠΊΡ€ΡƒΡ‚ΠΎ ΠΏΡ€ΠΈ написании нашСго ΠΊΠΎΠ΄Π°, ΠΌΡ‹ склонны Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ увСличСния ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹.

Но ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ это с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ макроса, Ρƒ вас ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹!

Допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ этот ΠΊΠΎΠ΄:

Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ x Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ 6, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ 5. ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ:

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ — подстановка макроса:

ABS (x ++) -> ((x ++) <0? - (x ++): (x ++))

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ x ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΈ Π΅Ρ‰Π΅ Ρ€Π°Π· ΠΏΡ€ΠΈ присвоСнии Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

Π›ΠΎΠ²ΡƒΡˆΠΊΠ° 3: ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

БоставлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² нашСм ΠΊΠΎΠ΄Π΅ — ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Π΄Π΅Π»ΠΎ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… для Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. И часто ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ это Ρ‚Π°ΠΊ:

И это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. Но ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ сдСлаСтС это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ макроса, Ρƒ вас ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ!

Допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ этот ΠΊΠΎΠ΄:

Π—Π΄Π΅ΡΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ рСкурсивная функция sum_chars . ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· для Π²Ρ‚ΠΎΡ€ΠΎΠΉ строки.
Но Ссли ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² макроса, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ 3 рСкурсивных Π²Ρ‹Π·ΠΎΠ²Π° вмСсто 2.
Для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… структур Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊΠΎΠΉ нСдостаток ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ большоС ΡƒΠ·ΠΊΠΎΠ΅ мСсто Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ОсобСнно, Ссли макрос ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ !

Π›ΠΎΠ²ΡƒΡˆΠΊΠ° 4: многострочныС макросы

Иногда ΠΌΡ‹ пытаСмся ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ мСста Π² Ρ„Π°ΠΉΠ»Π΅, Π½Π΅ помСщая скобки ΠΏΡ€ΠΈ написании Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² if.

Но Ссли ΠΌΡ‹ сдСлаСм Π²Ρ‹Π·ΠΎΠ² макроса Π²Π½ΡƒΡ‚Ρ€ΠΈ этого Π±Π»ΠΎΠΊΠ° ΠΈ этот макрос Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡΡ Π΄ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк, это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Π΅Π³ΠΎ Π²Ρ‹ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅.

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ пропускаСм Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку while, Π° ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ макрос Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк, Π² Ρ†ΠΈΠΊΠ»Π΅ while выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² макросС.
Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ бСсконСчному Ρ†ΠΈΠΊΠ»Ρƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ индСкс Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ увСличиваСтся.

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ макрос — это ΠΎΠΊΡ€ΡƒΠΆΠΈΡ‚ΡŒ содСрТимоС Ρ†ΠΈΠΊΠ»ΠΎΠΌ do-while ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π­Ρ‚ΠΎ Π±Ρ‹Π» послСдний.
Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, с макросами ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.
Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ стараСмся Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…, Ссли ΠΌΠΎΠΆΠ΅ΠΌ.

Но Ссли Π²Ρ‹ всС ΠΆΠ΅ Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π²Π°ΠΌ слСдуСт хотя Π±Ρ‹ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ соглашСния ΠΎΠ± ΠΈΠΌΠ΅Π½Π°Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π΅Π»ΠΎ с макросами.

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΌΠ΅ΠΆΠ΄Ρƒ функциями ΠΈ макросами огромная Ρ€Π°Π·Π½ΠΈΡ†Π°. А Π½Π΅ зная ΠΎΠ± этом, Ρƒ вас ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈ использовании макросов, я ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ стандарт для опрСдСлСния макросов Π² вашСм ΠΊΠΎΠ΄Π΅.

Π§Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

Π― Π²ΠΈΠ΄Π΅Π» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… всС опрСдСлСния макросов объявлялись Π’Π•Π Π₯ΠΠ˜Π™ Π Π•Π“Π˜Π‘Π’Π  .

Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… мСстах я встрСчал ΠΎΠ±Ρ€Π°Π·Π΅Ρ† прСфикса ΠΈΠΌΠ΅Π½ΠΈ макроса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ β€˜m’, , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π΄Π΅Π»ΠΎ с макросом.

Π§Ρ‚ΠΎ Π±Ρ‹ Π²Ρ‹ Π½ΠΈ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния. ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярным являСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ всСх ΠΈΠΌΠ΅Π½ макросов Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ этому соглашСнию.

Но, поТалуйста, слСдуйтС ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, сущСствуСт мноТСство ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ использовании макросов Π² своСм ΠΊΠΎΠ΄Π΅, ΠΈ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ программистов, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π΅Π»ΠΎ с макросом.

НадСюсь, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ функциями ΠΈ макросами.
Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ макросы ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты.

Но Ссли Π²Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ, поТалуйста, ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Ρ… камнях, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ, ΠΈ слСдуйтС Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΌΡƒ соглашСнию для опрСдСлСния макросов.

БвязанныС

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

__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__

Π­Ρ‚ΠΈ макросы ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ всСми компиляторами GNU, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ C прСпроцСссор: C, C ++ ΠΈ Objective-C. Π˜Ρ… цСнности — Π³Π»Π°Π²Π½Ρ‹Π΅ вСрсия, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ вСрсия ΠΈ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ исправлСния компилятора Π² Π²ΠΈΠ΄Π΅ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа константы.НапримСр, GCC 3.2.1 ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ __GNUC__ Ρ€Π°Π²Π½Ρ‹ΠΌ 3, __GNUC_MINOR__ Π½Π° 2 ΠΈ __GNUC_PATCHLEVEL__ Π½Π° 1. Они ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вСсь компилятор; Ссли Π²Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚Π΅ прСпроцСссор Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹.

__GNUC_PATCHLEVEL__ являСтся Π½ΠΎΠ²Ρ‹ΠΌ для GCC 3.0; ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ присутствуСт Π² ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ снимки Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ вСрсии 3.0 (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ сСбя ΠΊΠ°ΠΊ GCC 2.96 ΠΈΠ»ΠΈ 2.97, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Ρƒ вас снимок).

Если всС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, это компилируСтся Π»ΠΈ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GCC Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ __GNUC__.Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ‡Ρ‚ΠΎ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ вСрсии, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Π΅Π΅. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ младшСй вСрсии ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ исправлСния сбрасываСтся Π΄ΠΎ нуля; ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ основной вСрсии (Ρ‡Ρ‚ΠΎ случаСтся Ρ€Π΅Π΄ΠΊΠΎ) минорная вСрсия ΠΈ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ исправлСния ΡΠ±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ макросы прямо Π² условном Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π³ΠΎ нравится:

 / * ВСст для GCC> 3.2.0 * /
#if __GNUC__> 3 || \
    (__GNUC__ == 3 && (__GNUC_MINOR__> 2 || \
                       (__GNUC_MINOR__ == 2 && \
                        __GNUC_PATCHLEVEL__> 0)) 

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ — ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ макросы для вычислитС ΠΎΠ΄Π½ΠΎ число, Π·Π°Ρ‚Π΅ΠΌ сравнитС Π΅Π³ΠΎ с ΠΏΠΎΡ€ΠΎΠ³ΠΎΠΌ:

 #define GCC_VERSION (__GNUC__ * 10000 \
                     + __GNUC_MINOR__ * 100 \
                     + __GNUC_PATCHLEVEL__)
…
/ * ВСст Π½Π° GCC> 3.2.0 * /
#if GCC_VERSION> 30200 

МногиС люди находят эту Ρ„ΠΎΡ€ΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ простой для понимания.

__OBJC__

Π­Ρ‚ΠΎΡ‚ макрос опрСдСляСтся со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 1, ΠΊΠΎΠ³Π΄Π° компилятор Objective-C находится Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ __OBJC__, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, скомпилирован Π»ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ компилятором C ΠΈΠ»ΠΈ компилятором Objective-C.

__GNUG__

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ GNU C ++ опрСдСляСт это. ВСстированиС эквивалСнтно тСстированиС (__GNUC__ && __cplusplus).

__STRICT_ANSI__

GCC опрСдСляСт этот макрос Ρ‚ΠΎΠ³Π΄Π° ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΡŽΡ‡ -ansi ΠΈΠ»ΠΈ -std ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ строгоС соотвСтствиС ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ вСрсии ISO C, Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ GCC. Он опрСдСляСтся ΠΊΠ°ΠΊ 1. Π­Ρ‚ΠΎΡ‚ макрос сущСствуСт ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² GNU libc Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ свои опрСдСлСния ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ, Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌ Π² C 1989 Π³. стандарт.

__BASE_FILE__

Π­Ρ‚ΠΎΡ‚ макрос Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ ΠΈΠΌΠ΅Π½ΠΈ основного Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² Ρ„ΠΎΡ€ΠΌΠ΅ строковой константы C.Π­Ρ‚ΠΎ исходный Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС прСпроцСссора ΠΈΠ»ΠΈ компилятора C.

__INCLUDE_LEVEL__

Π­Ρ‚ΠΎΡ‚ макрос Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ дСсятичной цСлочислСнной константы, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ Π³Π»ΡƒΠ±ΠΈΠ½Π° влоТСния Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого макроса увСличиваСтся Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ #include ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π² ΠΊΠΎΠ½Π΅Ρ† ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Он начинаСтся с 0, это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС.

__VERSION__

Π­Ρ‚ΠΎΡ‚ макрос Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ строковой константы, которая описываСт Π²Π΅Ρ€ΡΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ компилятор.Π’Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π΅Π³ΠΎ содСрТимом Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π½ΠΎΠΌΠ΅Ρ€ выпуска.

__OPTIMIZE__, __OPTIMIZE_SIZE__, __NO_INLINE__

Π­Ρ‚ΠΈ макросы ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Ρ€Π΅ΠΆΠΈΠΌ компиляции. __OPTIMIZE__ — это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π²ΠΎ всСх ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… компиляциях. __OPTIMIZE_SIZE__ — это опрСдСляСтся, Ссли компилятор ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€, Π° Π½Π΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ. __NO_INLINE__ опрСдСляСтся, Ссли Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ встроСны Π² ΠΈΡ… Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ (ΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° встраиваниС Π±Ρ‹Π»ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ -fno-inline).

Π­Ρ‚ΠΈ макросы Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² GNU ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ опрСдСлСния систСмной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с использованиСм макросов ΠΈΠ»ΠΈ встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти макросы ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π½Π΅ сдСлаСтС ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ эффСктом нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹. Если ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 1.

__CHAR_UNSIGNED__

GCC опрСдСляСт этот макрос Ρ‚ΠΎΠ³Π΄Π° ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… char unsigned Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ машинС.Он сущСствуСт для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ стандартный Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„Π°ΠΉΠ» limits.h для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот макрос сам; вмСсто этого ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ стандартным макросам, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π² limits.h.

__REGISTER_PREFIX__

Π­Ρ‚ΠΎΡ‚ макрос Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π° (Π½Π΅ строковой константы), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся прСфикс, примСняСмый ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ рСгистров ЦП Π½Π° языкС ассСмблСра для этого Ρ†Π΅Π»ΡŒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для написания сборки, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… срСды. НапримСр, Π² срСдС m68k-aout это Π½Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ нуля, Π½ΠΎ Π² срСдС m68k-coff Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ%.

__USER_LABEL_PREFIX__

Π­Ρ‚ΠΎΡ‚ макрос Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся прСфиксом, примСняСмым ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΊΠΈ (символы, Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ для ΠΊΠΎΠ΄Π° C) Π² сборкС. НапримСр, Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ m68k-aout Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ _, Π½ΠΎ Π² срСда m68k-coff Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ нуля.

Π­Ρ‚ΠΎΡ‚ макрос Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, Π΄Π°ΠΆΠ΅ Ссли -f (no-) символы подчСркивания ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π½ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²Π΅Ρ€Π½ΠΎ, Ссли Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ спСцифичныС для Ρ†Π΅Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ этот прСфикс (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,Π³Ρ€Π°ΠΌΠΌ. Π² OSF / rose -mno-underscores ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€).

__SIZE_TYPE__, __PTRDIFF_TYPE__, __WCHAR_TYPE__, __WINT_TYPE__

Π­Ρ‚ΠΈ макросы ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² для size_t, ptrdiff_t, wchar_t ΠΈ wint_t typedefs соотвСтствСнно. Они ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ для создания стандартных Ρ„Π°ΠΉΠ»ΠΎΠ² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ². stddef.h ΠΈ wchar.h Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π’Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти макросы Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ; вмСсто этого Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ typedefs.

__USING_SJLJ_EXCEPTIONS__

Π­Ρ‚ΠΎΡ‚ макрос опрСдСляСтся со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 1, Ссли компилятор ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΡ‚Π°Ρ€ΡƒΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π½Π° основС setjmp ΠΈ longjmp для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΡƒΠΌΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹

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

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Ρ„Π°ΠΉΠ»Π° исходного ΠΊΠΎΠ΄Π° C — это двухэтапный процСсс. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ шагом Π² этом процСссС являСтся запуск Ρ„Π°ΠΉΠ»Π° исходного ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ прСпроцСссором C. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ прСпроцСссора проходят Ρ‡Π΅Ρ€Π΅Π· сам компилятор C.

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ — это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°ΠΌΠ΅Π½Ρ‹ тСкста. Π—Π°Π΄Π°Ρ‡Π° прСпроцСссора — ΠΈΡΠΊΠ°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора , встроСнныС Π² исходный ΠΊΠΎΠ΄.Π­Ρ‚ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Π»Π΅Π³ΠΊΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ: всС ΠΎΠ½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с символа #.

Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚, опрСдСляСт ΠΈ конструируСт if / else

Бамая извСстная Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° прСпроцСссора — это ΠΊΠΎΠΌΠ°Π½Π΄Π° #include. ЦСль этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ — Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ тСкст Ρ„Π°ΠΉΠ»ΠΎΠ² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Π² Ρ„Π°ΠΉΠ»Ρ‹ исходного ΠΊΠΎΠ΄Π°.

Когда прСпроцСссор встрСчаСт Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #include, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€

#include 
 

ΠΎΠ½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ рассматриваСмый Ρ„Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ всС Π΅Π³ΠΎ содСрТимоС Π² Ρ„Π°ΠΉΠ» исходного ΠΊΠΎΠ΄Π° вмСсто ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° #include.

Π”Ρ€ΡƒΠ³ΠΎΠΉ Π·Π½Π°ΠΊΠΎΠΌΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ являСтся ΠΊΠΎΠΌΠ°Π½Π΄Π° #define, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для использования Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ этого являСтся

#define ARRAY_SIZE 100
 

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ #define для Π·Π°ΠΌΠ΅Π½Ρ‹ тСкста. ПослС обнаруТСния #define Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ прСпроцСссор Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ тСкст ARRAY_SIZE Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 100 Π²Π΅Π·Π΄Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ исходного ΠΊΠΎΠ΄Π°.

#defines ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² сочСтании с #ifdef.. #else .. #endif construct. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

#ifdef ARRAY_SIZE
  int A [ARRAY_SIZE];
#Π΅Ρ‰Π΅
  int A [20];
#endif
 

ЦСлью этой конструкции являСтся Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² Ρ„Π°ΠΉΠ» исходного ΠΊΠΎΠ΄Π°. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ символ ARRAY_SIZE , прСпроцСссор оставит ΠΏΠ΅Ρ€Π²ΠΎΠ΅ объявлСниС для A Π² Ρ„Π°ΠΉΠ»Π΅ исходного ΠΊΠΎΠ΄Π° ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠ΅. Если ARRAY_SIZE Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, прСпроцСссор ΡƒΠ΄Π°Π»ΠΈΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ объявлСниС для A ΠΈ вмСсто этого вставит Π²Ρ‚ΠΎΡ€ΠΎΠ΅.

макросы

Π”Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² прСпроцСссора — это макрос. НазначСниС макросов — Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ выглядит ΠΈ Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠ°ΠΊ объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. #Define Π½ΠΈΠΆΠ΅ устанавливаСт макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ возвСдСния Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚.

#define SQ (x) x * x
 

Π­Ρ‚ΠΎ опрСдСляСт макрос SQ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вычисляСт ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ своСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. макросы Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ подстановки тСкста. ПослС опрСдСлСния макроса SQ прСпроцСссор Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ любой тСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит ΠΊΠ°ΠΊ SQ () , ΠΈ замСняСт Π΅Π³ΠΎ тСкстом * .

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ макрос Π½Π° самом Π΄Π΅Π»Π΅ являСтся ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ подстановки тСкста, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ настройкС ΠΈ использовании макросов. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΉΡ‚ΠΈ Π½Π΅ Ρ‚Π°ΠΊ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Π² вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит Ρ‚Π°ΠΊ:

Ссли (SQ (x + 1)> 4)
 

Когда прСпроцСссор встрСчаСт эту строку, ΠΎΠ½ выполняСт Π·Π°ΠΌΠ΅Π½Ρƒ тСкста, ΡƒΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ SQ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ произвСсти Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ этого:

Ссли (x + 1 * x + 1> 4)
 

ВСроятно, это Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ.ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ макрос — это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ подстановки тСкста, Π° Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΡ€Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ этому.

Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ — использованиС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Ρ‰ΠΈΡ‚Π½Ρ‹Ρ… скобок Π² исходном ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ макроса. Если ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π°

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ SQ (x) (x) * (x)
 

прСпроцСссор ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Ρ‚

Ссли (SQ (x + 1)> 4)
 

Π²

Ссли ((x + 1) * (x + 1)> 4)
 

, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

основных макросов для программирования Π½Π° C

Π― ΡˆΠΈΡ€ΠΎΠΊΠΎ использовал C Π² 1989–1992 Π³ΠΎΠ΄Π°Ρ….ПослС этого Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя это Π±Ρ‹Π» C ++. Π‘ 1999 Π³ΠΎΠ΄Π° я Π½Π°Ρ‡Π°Π» ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Java, Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ C # для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Windows.

Π’ сСрСдинС 2005 Π³ΠΎΠ΄Π° ΠΌΠ½Π΅ довСлось ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ C, ΠΈ я ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ наслаТдался этим ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ. Π― ΠΌΠΎΠ³ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· макросов C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я написал Π΅Ρ‰Π΅ Π² Π½Π°Ρ‡Π°Π»Π΅ 1990-Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Π·Π°Π΄ΡƒΠΌΠ°Π», Π½ΠΎ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π».

IMHO, Π·Π½Π°Π½ΠΈΠ΅ C ++ ΠΈ Java позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° C ΠΈ Π΄Π°ΠΆΠ΅ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ООП.ΠžΠΏΡ‹Ρ‚ Π² C / C ++ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° Java ΠΈ C #, ΠΏΠΎ-настоящСму ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ удобство, обСспСчиваСмоС сборщиком мусора, ΠΈ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ прилоТСния ΠΏΡ€ΠΈ запускС ΠΏΠΎΡ‚ΠΎΠΊΠ° сборщика мусора. Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Π₯отя я Π½Π΅ ΡƒΠΏΡƒΡΠΊΠ°ΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ C ΠΈ AutoPointers C ++, я ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΡΠΊΡƒΡ‡Π°ΡŽ ΠΏΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² Java. Π Π°Π΄, Ρ‡Ρ‚ΠΎ Π² C # поддСрТиваСтся ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Π° Π΅Π΅ функция дСлСгирования, бСзусловно, заслуТиваСт одобрСния.

ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с Π²Π°ΠΌΠΈ макросами C ΠΈ надСюсь, Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ ΠΈΡ… ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ.

Java ΠΈ C # ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β« Π΄Π»ΠΈΠ½Π° Β» для получСния Π΄Π»ΠΈΠ½Ρ‹ любого Ρ‚ΠΈΠΏΠ° массива. Π£ нас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ аналогичная Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² C, Π½ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для массивов фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π° Π½Π΅ для динамичСских массивов, созданных с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ malloc ΠΈΠ»ΠΈ calloc.

#define GET_ARRAY_LEN (имя_массива) (sizeof (имя_массива) / sizeof ((имя_массива) [0])) 

MIN ΠΈ MAX — это часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ макросы, ΠΈ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ.Π˜Ρ… ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ, Ссли ΠΈΡ… Π½Π΅Ρ‚ Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ.

#ifndef MIN
#define MIN (n1, n2) ((n1)> (n2)? (n2): (n1))
#endif

#ifndef MAX
#define MAX (n1, n2) ((n1)> (n2)? (n1): (n2))
#endif 

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

#define ALIGN_SIZE (sizeToAlign, PowerOfTwo) \
        (((sizeToAlign) + (PowerOfTwo) - 1) & ~ ((PowerOfTwo) - 1))

#define IS_SIZE_ALIGNED (sizeToTest, PowerOfTwo) \
        (((sizeToTest) & ((PowerOfTwo) - 1)) == 0) 

Π’Ρ‚ΠΎΡ€ΠΎΠΉ макрос эквивалСнтСн ((sizeToTest% PowerOfTwo) == 0) .ΠœΠ°ΠΊΡ€ΠΎΡ ΠΈΠ·Π±Π΅Π³Π°Π΅Ρ‚ дорогостоящСго ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΠΈ выполняСт Ρ‚ΠΎ ΠΆΠ΅ самоС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Волько Ссли Π·Π½Π°ΠΌΠ΅Π½Π°Ρ‚Π΅Π»ΡŒ прСдставляСт собой Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ Π΄Π²ΠΎΠΉΠΊΠΈ, Ρ‚ΠΎ для получСния остатка ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ И .

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ макрос эквивалСнтСн (sizeToAlign + PowerOfTwo - 1) / PowerOfTwo * PowerOfTwo . ΠœΠ°ΠΊΡ€ΠΎΡ ΠΈΠ·Π±Π΅Π³Π°Π΅Ρ‚ цСлочислСнного дСлСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ умноТСния. Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ компиляторы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, Π½ΠΎ Π·Π°Ρ‡Π΅ΠΌ Ρ€ΠΈΡΠΊΠΎΠ²Π°Ρ‚ΡŒ, Ссли ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π±Π΅Π· особого Ρ‚Ρ€ΡƒΠ΄Π°.

ΠœΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы, Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ смСщСниС любого поля, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся Ρ‡Π»Π΅Π½ΠΎΠΌ структуры, Π° Ρ‚Π°ΠΊΠΆΠ΅ для получСния адрСса поля с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Π΅Π³ΠΎ смСщСния.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ макросы, связанныС со структурой struct , — это ALLOC_STRUCT ΠΈ INIT_STRUCT . Π― ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ ΠΊΠΎΠ΄ Π»Π΅Π³ΠΊΠΎ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ, ΡΠΎΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ количСство Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ клавиш для Π²Π²ΠΎΠ΄Π° ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΡŽΡ‚ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ошибок.


#define GET_FIELD_OFFSET (StructName, FieldName) \
        ((ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅) (Π΄Π»ΠΈΠ½Π½ΠΎΠ΅) (& ((StructName *) NULL) -> FieldName))

#define GET_FIELD_PTR (pStruct, nOffset) \
        ((void *) (((char *) pStruct) + (nOffset)))


#define ALLOC_STRUCT (StructName) ((StructName *) malloc (sizeof (StructName)))


#define INIT_STRUCT (pStruct) (memset (pStruct, '\ 0', sizeof (* (pStruct)))) 

Π’ΠΎΡ‚ нСсколько простых, Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… макросов.Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ мою Π»ΡŽΠ±ΠΈΠΌΡƒΡŽ строчку ΠΈΠ· самой ΠΎΠ±ΠΎΠΆΠ°Π΅ΠΌΠΎΠΉ ΠΈ извСстной ΠΊΠ½ΠΈΠ³ΠΈ Β«Π―Π·Ρ‹ΠΊ программирования CΒ» Π‘Ρ€Π°ΠΉΠ°Π½Π° Π’. ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½Π° ΠΈ ДСнниса М. Π ΠΈΡ‡ΠΈ. Π¦ΠΈΡ‚Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΎΠΉ, Π½ΠΎ я ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ понял.
Β«ΠŸΡ€ΠΎΡΡ‚ΠΎ всСгда элСгантно. Π­Π»Π΅Π³Π°Π½Ρ‚Π½ΠΎ всСгда просто. Но Π½Π΅ ΠΏΡ€ΠΎΡ‰Π΅Β». .

Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΠΏΠ»ΠΎΡ…ΠΎ Π·Π½Π°ΠΊΠΎΠΌ с C, «ΠšΠ½ΠΈΠ³Π° ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° C» ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°, ΠΈ ΠΎΠ½Π° содСрТит Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊ упраТнСниям, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ Π΅Ρ‰Π΅ нСсколько ΠΊΠ½ΠΈΠ³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ½Π΅ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΎΡΡŒ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, это Β«Π›ΠΎΠ²ΡƒΡˆΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ CΒ», «НаписаниС Ρ‚Π²Π΅Ρ€Π΄ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°Β», Β«Π–Π΅ΠΌΡ‡ΡƒΠΆΠΈΠ½Ρ‹ программирования», Β«Π•Ρ‰Π΅ нСсколько ΠΆΠ΅ΠΌΡ‡ΡƒΠΆΠΈΠ½ программирования», Β«Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС CΒ» ΠΈ Ρ‚. Π”.

Π’ΠΎΡ‚ эти простыС макросы для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, являСтся Π»ΠΈ Π΄Π°Π½Π½ΠΎΠ΅ число Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ ΠΈ находится Π»ΠΈ число ΠΌΠ΅ΠΆΠ΄Ρƒ двумя значСниями (ΠΎΠ±Π° Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ).

#define IS_ODD (число) ((число) & 1)

#define IS_EVEN (число) (! IS_ODD ((число)))


#define IS_BETWEEN (numToTest, numLow, numHigh) \
        ((символ бСз знака) ((numToTest)> = (numLow) && (numToTest) <= (numHigh))) 

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ макрос заимствован ΠΈΠ· MFC (Microsoft Foundation Classes) для подавлСния ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ компилятора ΠΎ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.


#define ΠΠ•Π˜Π‘ΠŸΠžΠ›Π¬Π—Π£Π•ΠœΠ«Π• (ParamName) \
        ((void) (0? ((ParamName) = (ParamName)): (ParamName))) 

Иногда Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±Π»ΠΎΠΊ Π±Π΅Π· использования Β«, Ссли Β», Β« для Β» ΠΈΠ»ΠΈ Β«, Π° Β». Π’ C это ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, которая прСдставляСт собой массив Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, ΠΈ этот массив Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк ΠΊΠΎΠ΄Π°. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ фигурная скобка заставит массив Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· области видимости, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌΡƒ освобоТдСнию памяти стСка, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ массивом.

Π’ случаС C ++, Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ массиву, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ экзСмпляры Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… классов Π² качСствС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· области видимости, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Ρ„ΠΈΠ³ΡƒΡ€Π½ΡƒΡŽ скобку, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ дСструкторов всСх этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ высвобоТдСниС всСх рСсурсов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… этими ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

Π’ Ρ‚Π°ΠΊΠΈΡ… случаях я счСл Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы BEGIN_BLOCK ΠΈ END_BLOCK вмСсто Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… отступов ΠΊΠΎΠ΄Π° ΠΈ Ρ‡Π΅Ρ‚ΠΊΠΎ транслируСт намСрСния ΠΎΠ± освобоТдСнии рСсурсов.


#define BEGIN_BLOCK {


#define END_BLOCK} 

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ макросы, связанныС с порядком Π±Π°ΠΉΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΎΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ. АрхитСктура памяти, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎΠΌ машин CISC, являСтся Little-Endian, Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ RISC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Big-Endian, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сравнСниС Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ ЦП здСсь. Π­Ρ‚ΠΈ слова Little-Endian ΠΈ Big-Endian заимствованы ΠΈΠ· классичСского произвСдСния Π”ΠΆΠΎΠ½Π°Ρ‚Π°Π½Π° Π‘Π²ΠΈΡ„Ρ‚Π° Β«ΠŸΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΡ Π“ΡƒΠ»Π»ΠΈΠ²Π΅Ρ€Π°Β». Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π° Π΄Π²ΡƒΡ… Π²Ρ€Π°ΠΆΠ΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„Ρ€Π°ΠΊΡ†ΠΈΠΉ Π»ΠΈΠ»ΠΈΠΏΡƒΡ‚ΠΎΠ², Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π² этой Π²Π½Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ сатирС.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ бСспокойство Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΌΡ‹ сохраняСм Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ ΠΈ Ссли Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌ Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ порядок Π±Π°ΠΉΡ‚ΠΎΠ². Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли числовая пСрСмСнная, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ составляСт 16 Π±ΠΈΡ‚ ΠΈΠ»ΠΈ большС, записываСтся Π² Ρ„Π°ΠΉΠ» ΠΈ снова читаСтся Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅Ρ‚. Но Ссли Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ порядок Π±Π°ΠΉΡ‚ΠΎΠ², Ρ‚ΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² пСрСстановкС Π±Π°ΠΉΡ‚ΠΎΠ². Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊΠΎ всСм числовым Ρ‚ΠΈΠΏΠ°ΠΌ, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚, ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами, Ρ‚Π°ΠΊ ΠΈ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой.

Java ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Big-Endian ΠΏΡ€ΠΈ записи ΠΈΠ»ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„Π°ΠΉΠ» читаСтся Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прилоТСниями Java, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅Ρ‚. Однако, Ссли ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ язык, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ C ΠΈΠ»ΠΈ C ++, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для чтСния Ρ„Π°ΠΉΠ»Π°, написанного ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Java, ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° порядок Π±Π°ΠΉΡ‚ΠΎΠ².

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ макросам. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° макроса IS_LITTLE_ENDIAN ΠΈ IS_BIG_ENDIAN Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ИБВИНА ΠΈΠ»ΠΈ Π›ΠžΠ–Π¬ Π² зависимости ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ памяти Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°.Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ΄Π΅Ρ‚ самый Π²Π°ΠΆΠ½Ρ‹ΠΉ макрос IS_DEFAULT_ENDIAN , Π³Π΄Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

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

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

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ ΠΏΠΎΠ΄ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ΠΉ. Π‘ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, Ссли Π²Ρ‹ оставитС свои ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, мнСния ΠΈΠ»ΠΈ прСдлоТСния, Π° ΠΏΠΎΠΊΠ° я Π½Π°Ρ‡Π½Ρƒ Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒΡΡ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ принСсти Π²Π°ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ пост Π² Π±Π»ΠΎΠ³Π΅.


#define IS_LITTLE_ENDIAN () (((* (ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ *) "21") & 0xFF) == '2')


#define IS_BIG_ENDIAN () (((* (ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ *) "21") & 0xFF) == '1')


#define IS_DEFAULT_ENDIAN () IS_LITTLE_ENDIAN ()


#define REVERSE_BYTE_ARRAY (массив Π±Π°ΠΉΡ‚ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ€) \
        Ссли (! IS_DEFAULT_ENDIAN ()) \
        {\
            int _i, _j; \
            char _cTmp; \
            for (_i = 0, _j = (Π Π°Π·ΠΌΠ΅Ρ€) - 1; _i <_j; _i ++, _j--) \
            {\
                _cTmp = ((char *) (ByteArray)) [_i]; \
                ((char *) (ByteArray)) [_i] = ((char *) (ByteArray)) [_j]; \
                ((char *) (ByteArray)) [_j] = _cTmp; \
            } \
        }


#define CONVERT_NUM (n) REVERSE_BYTE_ARRAY ((& (n)), sizeof (n))


#define CONVERT_NUM16 (n) ((void) (IS_DEFAULT_ENDIAN ()? (n) \
        : ((n) = ((((n) & 0x00FF) << 8) | (((n) & 0xFF00) >> 8)))))


#define CONVERT_NUM32 (n) ((void) (IS_DEFAULT_ENDIAN ()? (n) \
        : ((n) = ((((n) & 0x000000FF) << 24) | (((n) & 0x0000FF00) << 8) \
        | (((n) & 0xFF0000) >> 8) | (((n) & 0xFF000000) >> 24)))))


#define CONVERT_FLOAT (f) CONVERT_NUM32 ((* (Π΄Π»ΠΈΠ½Π½ΠΎΠ΅ *) & (f)))


#define CONVERT_DOUBLE (d) CONVERT_NUM (d)


#define CONVERT_NUM64 (n) CONVERT_NUM (n) 
ΠœΠ°ΠΊΡ€ΠΎΡΡ‹

- Π£Ρ‡Π΅Π±Π½ΠΈΠΊΠΈ ΠΏΠΎ C - Sanfoundry

Π­Ρ‚ΠΎΡ‚ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊ ΠΏΠΎ C ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ макросы Π½Π° языкС C с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ настоящими функциями. НапримСр,

 #define MAX (a, b) ((a)> (b)? (A): (b)) 

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° C,

 #include 
#define MAX (a, b) ((a)> (b)? (a): (b))

int main (пусто)
{
    int x = 10, y = 15;
    ΠΏΠΎΠΏΠ»Π°Π²ΠΎΠΊ u = 2.0, v = 3.0;
    Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ s = 5, t = 5;

    printf ("ΠœΠ°ΠΊΡΠΈΠΌΡƒΠΌ Π΄Π²ΡƒΡ… Ρ†Π΅Π»Ρ‹Ρ… чисСл% d ΠΈ% d Ρ€Π°Π²Π΅Π½:% d \ n", x, y, MAX (x, y));
    printf ("Макс. ΠΈΠ· Π΄Π²ΡƒΡ… чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой% .2f ΠΈ% .2f:% .2f \ n", u, v, MAX (u, v));
    printf ("ΠœΠ°ΠΊΡΠΈΠΌΡƒΠΌ Π΄Π²Π° Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ…%.2lf ΠΈ% .2lfis:% lf \ n ", s, t, MAX (s, t));

    Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;
} 

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄:

 МаксимальноС количСство Π΄Π²ΡƒΡ… Ρ†Π΅Π»Ρ‹Ρ… чисСл 10 ΠΈ 15: 15
МаксимальноС количСство ΠΏΠΎΠΏΠ»Π°Π²ΠΊΠΎΠ² 2,00 ΠΈ 3,00: 3,00
ΠœΠ°ΠΊΡΠΈΠΌΡƒΠΌ Π΄Π²Π° Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… 5.00 ΠΈ 5.00is: 5.000000 

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‚ ΠΆΠ΅ макрос MAX (a, b) оцСниваСтся ΠΊΠ°ΠΊ большСС ΠΈΠ· Π΄Π²ΡƒΡ… Ρ†Π΅Π»Ρ‹Ρ… чисСл, Π΄Π²ΡƒΡ… чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, Π΄Π²ΡƒΡ… чисСл Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности ΠΈ Ρ‚. Π”. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ макросы Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏΠ°. Если Π±Ρ‹ ΠΌΡ‹ использовали вмСсто этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π±Ρ‹ Ρ‚Ρ€ΠΈ, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° Π²Ρ‹Π·ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π’ΠΎΠ³Π΄Π° ΠΊΡ‚ΠΎ ΠΈΠ· этих Π΄Π²ΡƒΡ… эффСктивнСС Π΄Ρ€ΡƒΠ³ΠΈΡ…? Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ свои достоинства ΠΈ нСдостатки. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, макросы Π±ΠΎΠ»Π΅Π΅ эффСктивны, Ρ‡Π΅ΠΌ настоящиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ΄Π½Π° ΠΈΠ»ΠΈ Π΄Π²Π΅ строки ΠΊΠΎΠ΄Π°. МАКБ (Π°, Π±). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ прСпроцСссор выполняСт Ρ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΡƒΡŽ Π·Π°ΠΌΠ΅Π½Ρƒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΎΠ½ замСняСт ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ макроса своим тСкстом измСнСния, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΉ, Ссли макрос Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ малСнький. Π₯отя это Π½Π΅ влияСт Π½Π° ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π·Π°Ρ‚ΠΎ замСдляСт процСсс компиляции.КаТдая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ копию ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая вызываСтся ΠΏΡ€ΠΈ нСобходимости Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ.

Sanfoundry Global Education & Learning Series - Π£Ρ‡Π΅Π±Π½ΠΈΠΊΠΈ ΠΏΠΎ 1000 C.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всС ΡƒΡ‡Π΅Π±Π½Ρ‹Π΅ пособия ΠΏΠΎ C, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΊ ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΌ пособиям ΠΏΠΎ C.
ΠžΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

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

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