А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Э Ю Я

 

Реферат: Все о Turbo Basic

 


 

Все о Turbo Basic

Прхярюцхссюр ячыър C. ==================================================================== Сюфхрцрэшх Втхфхэшх 4 1. Осщшх яpхюсpрчютрэшя 5 2. Дшрхътшты Прхярюцхссюрр 7 3. Пюфъыючрхьых фрщыы 8 3.1. Исяюыьчютрэшх яюфъыючрхьых фрщыют. 8 3.2. Дшрхътштр '#include'. 8 3.3. Кръ ррсютрхт фшрхътштр '#include' 10 3.4. Офэюърртэю яюфъыючрхьых фрщыы 11 3.5. Пюфъыючрхьых фрщыы ш эрсыхфютрэшх 12 4. Мрърюсы 14 4.1. Прюстых ьрърюсы 14 4.2. Мрърюсы с ррууьхэтрьш 16 4.3. Зрррэхх юярхфхыхээых ьрърюсы 18 4.3.1. Стрэфрртэых чрррэхх юярхфхыхээых ьрърюсы 19 4.3.2. Нхстрэфрртэых чрррэхх юярхфхыхээых ьрърюсы 23 4.4. Стршэушфшърцшя 25 4.5. Осъхфшэхэшх 27 4.6. Уфрыхэшх ьрърюсют 28 4.7. Пхрхюярхфхыхэшх ьрърюсют 29 4.8. Осюсхээюстш шсяюыьчютрэшя ьрърюсют 30 4.8.1. Нхярртшыьэю шсяюыьчухьых ъюэструъцшш 30 4.8.2. Нхстрэфрртэря уруяяшрютър рршфьхтшчхсъшх тыррцхэшщ 31 4.8.3. Исяюыьчютрэшх тючъш с чряятющ 32 4.8.4. Уфтюхэшх яюсючэых эффхътют 34 4.8.5. Рхъурсштэых ьрърюсы 35 4.8.6. Отфхыьэря яюфстрэютър ьрърю ррууьхэтют 36 4.8.7. Зртшсшьых ьрърюсы 39 4.9. Сшьтюыы newline т ьрърюррууьхэтрх 40 5. Усыютшя 42 5.1. Дыя чхую шсяюыьчуются усыютшя 42 5.2. Сшэтръсшс усыютшщ 43 5.2.1. Дшрхътштр '#if' 43 5.2.2. Дшрхътштр '#else' 44 5.2.3. Дшрхътштр '#elif' 45 5.3. Сюхррэхэшх уфрыхээюую ъюфр фыя фрыьэхщшшх ссыыюъ 46 5.4. Усыютшя ш ьрърюсы 46 5.5. Уттхрцфхэшя 48 5.6. Дшрхътшты '#error' ш '#warning' 51 6. Кюьсшэшрютрэшх шсхюфэых фрщыют 53 7. Друушх фшрхътшты ярхярюцхссюрр 55 8. Вытюф С ярхярюцхссюрр 56 9. Вычют GNU С Прхярюцхссюрр 57 Втхфхэшх С яpхяpюцхссюp ятыяхтся яpюцхссюpюь ьръpюъюьрэф ш рттюьртшчхсъш шсяюыьчухтся С ъюьяшыятюpюь яхpхф юсpрсютъющ яpюуpрььы фыя тэхсхэшя т эхх эхъютюpых шчьхэхэшщ. Пpхяpюцхссюp яючтюыяхт юяpхфхыять ьръpюсы, шсяюыьчютрэшх ъютюpых яюьюурхт шчсхурть яpшьхэхэшя сыюцэых ъюэстpуъцшщ. С яpхяpюцхссюp яpхфюстртыяхт эхсъюыьъю юсэютэых фуэъцшщ: Въыючхэшх т яpюуpрььу фюяюыэштхыьэых фрщыют, сюфхpцрщшх юяpхфхыхэшя pрчышчэых фуэъцшщ. Сючфрэшх ьръpюсют, ъютюpых ятыяются сюъpрщхэшяьш фыя яpюшчтюыьэых фpруьхэтют шсхюфэюую тхъстр яpюуpрььы, ш шх чрьхэр яpхяpюцхссюpюь эр сююттхтсттующшх ьръpююяpхфхыхэшя тю тсхщ яpюуpрььх. Усыютэря ъюьяшыяцшя. Исяюыьчуя сяхцшрыьэых фшpхътшты яpхяpюцхссюpр шьххтся тючьюцэюсть тъыючхэшя шыш шсъыючхэшя чрстхщ яpюуpрььы т чртшсшьюстш ют pрчышчэых усыютшщ. Кюэтpюыь стpюъш. Есыш яpш ъюьсшэшpютрэшш шыш pхюpурэшчрцшш шсхюфэых фрщыют т ъръющ-ышсю яpюьхцутючэыщ фрщы, ъютюpыщ тяюсыхфсттшш ъюьяшышpухтся, шсяюыьчухтся ютфхыьэря яpюуpрььр, тю шьххтся тючьюцэюсть яpшьхэхэшя ъюэтpюыя стpюъш фыя яхpхфрчш шэфюpьрцшш ъюьяшыятюpу ю ьхстюpрсяюыюцхэшш ърцфющ стpюъш шсхюфэюую тхъстр яpюуpрььы. Ррчышчэых С яpхяpюцхссюpы шьхют эхъютюpых ютышчшя. В фрээюь pуъютюфсттх pрссьртpштрхтся GNU С яpхяpюцхссюp, сютьхстшьыщ с С ъюьяшыятюpрьш. GNU С яpхяpюцхссюp сюфхpцшт фюяюыэштхыьэыщ эрсюp тючьюцэюстхщ, т фюяюыэхэшх ъ тхь, ъютюpых тхюфят т стрфрpт ANSI. Стрэфрpт ANSI С чряpхщрхт шсяюыьчютрэшх ьэюушх ъюэстpуъцшщ, юсычэю шсяюыьчухьых т С яpюуpрььрх т эрстюящхх тpхья. Тръря эхсютьхстшьюсть ьюцхт фюстртшть эхъютюpых эхуфюссттр фыя яюыьчютртхыхщ, яюэтюьу GNU С яpхяpюцхссюp съюэфшууpшpютрэ тръ, чтю юэ яю уьюычрэшю шсяюыьчухт яюфюсэых ъюэстpуъцшш. Гpусю уютюpя, фыя pрсюты с яpхяpюцхссюpюь т стрэфрхустX¶Е pтх ANSI С, хую сыхфухт тычытрть с юяцшяьш `-trigraphs', `-undef' ш `-pedantic'. 1. Осщшх яpхюсpрчютрэшя Бюыьшшэсттю фуэъцшщ С яpхяpюцхссюpр ятыяются эхюсpртшьыьш, эхсьютpя эр тю, чтю фыя тыяюыэхэшя ъръшх-ышсю фхщсттшщ, яpхяpюцхссюpу уърчытрют сяхцшрыьэых фшpхътшты. (Дшpхътштрьш яpхяpюцхссюpр ятыяются стpюъш, эрчшэрющшхся с сшьтюыр '#'.) Сущхсттухт тpш яpхюсpрчютрэшя, ъютюpых яpхяpюцхссюp тыяюыэяхт фыя тсхх юсpрсртытрхьых фрщыют, фрцх яpш ютсутсттшш фшpхътшт. Всх ъюььхэтрpшш С чрьхэяются яpюсхырьш. Пюсыхфютртхыьэюстш сшьтюыют backslash-newline уфрыяются, тэх чртшсшьюстш ют шх ьхстюяюыюцхэшя. Этю яючтюыяхт яpхpытрть фышээых стpюъш т яpюуpрььх фыя хх юфюpьыхэшя. Зрpрэхх юяpхфхыхээых ьръpюсы чрьхэяются сююттхтсттующшьш юяpхфхыхэшяьш. Пхpтых фтр яpхюсpрчютрэшя тыяюыэяются яpрътшчхсъш яхpхф тсхьш юстрыьэыьш яpюхюфрьш, тъыючря уpрььртшчхсъшщ pрчсюp, ш яхpхф юсpрсютъющ фшpхътшт яpхяpюцхссюpр. Пюэтюьу, ьюцэю т ыюсюь ьхстх яpюуpрььы pрчсшть стpюъу эр эхсъюыьъю чрстхщ с яюьющью яюсыхфютртхыьэюстхщ backslash-newline (ъpюьх сштурцшщ сшсяюыьчютрэшхь trigraph, сь. эшцх). /* */ # /* */ defi\ ne FO\ O 10\ 20 ятыяхтся шфхэтшчэыь стpюъх '#define FOO 1020'. Тръшь цх юсpрчюь ьюцэю pрчсшть фрцх escape-яюсыхфютртхыьэюсть. Нряpшьхp, ьюцэю pрчсшть стpюъу '"foo\bar"' эр фтх чрстш ьхцфу '\' ш 'b' сыхфующшь юсpрчюь: "foo\\ bar" Хютя сущхсттуют шсъыючхэшя. В тхъстютых ъюэстрэтрх фыя тстртъш сшьтюыр '\' шсяюыьчухтся яюсыхфютртхыьэюсть '\\'. Стрэфррт ANSI трхсухт яршьхэхэшя яюфюсэых ъюэструъцшщ. (В фхщсттштхыьэюстш, т ANSI C эх ррчрхшрхтся ррчсштрть тхъстютых ъюэстрэты эр эхсъюыьъю стрюъ, яюэтюьу этю эх счштрхтся ярюсыхьющ.) К тюьу цх сущхсттуют шсъыючхэшя, ърсрющшхся тсхх трхх тшяют ярхюсррчютрэшщ. Кюььхэтрршш С ш чрфрээых шьхэр ьрърюсют эх ррсяючэрются т фшрхътштх '#include', уфх шья фрщыр юуррэшчхэю сшьтюырьш ''. Кюььхэтрршш С ш шьхэр ьрърюсют эшъюуфр эх ррсяючэрются т сшьтюыьэых ш стрюъютых ъюэстрэтрх. Пюсыхфютртхыьэюстш backslash-newline эх ьюуут яюыэюстью шсяюыьчютрться т ANSI тршуррфрх. Тршуррфы ярхюсррчуются яхрхф уфрыхэшхь яюсыхфютртхыьэюстхщ backslash-newline. Этю шсъыючхэшх фхщсттштхыьэю, хсыш фыя ррсюты с тршуррфрьш шсяюыьчухтся юяцшя '-trigraph'. 2. Дшрхътшты Прхярюцхссюрр Бюыьшшэсттю тючьюцэюстхщ ярхярюцхссюрр рхрышчухтся с шсяюыьчютрэшхь сяхцшрыьэых фшрхътшт. Дшрхътштрьш ярхярюцхссюрр ятыяются стрюъш, эрчшэрющшхся с сшьтюыр '#', чр ъютюрыь сыхфухт шфхэтшфшъртюр, эрчытрхьыщ шьхэхь фшрхътшты. Ррчрхшрхтся шсяюыьчютрэшх ярюсхыют яхрхф ш яюсых сшьтюыр '#'. Сущхсттухт стрюушщ эрсюр фшрхътшт. Прюуррььы эх ьюуут юярхфхыять эютых фшрхътшты. Нхъютюрых фшрхътшты трхсуют эрышчшя ррууьхэтют, ъютюрыьш ятыяхтся юстртшряся чрсть стрюъш ютфхыхээря ют шьхэш фшрхътшты юфэшь шыш эхсъюыьъшьш ярюсхырьш. Осычэю, фшрхътштр ярхярюцхссюрр эх ьюцхт чрэшьрть сюыхх юфэющ стрюъш. Хютя, юэр ьюцхт сыть ррчсштр с яюьющью яюсыхфютртхыьэюстш backslash-newline. Кюььхэтрршш, сюфхрцрщшх яхрхэюс стрюъш, тръцх ррчсштрют фшрхътшту эр эхсъюыьъю стрюъ, эю яхрхф юсррсютъющ фшрхътшты тсх ъюььхэтрршш чрьхэяются ярюсхырьш. Есыш сшьтюы яхрхэюср стрюъш эрхюфштся тэутрш сшьтюыьэющ шыш стрюъютющ ъюэстрэты, тю ярхярюцхссюр юсррсртытрхт яюсыхфующшх стрюъш, ъръ эшчхь эх стячрээых с ярхфыфущхщ. Сшьтюы '#' ш шья фшрхътшты эх ярюшсхюфят ют ьрърюррсшшрхэшя. Нряршьхр, хсыш 'foo' ятыяхтся ярррьхтрюь фшрхътшты 'define', тю этю эх чэрчшт, чтю '#foo' этю фшрхътштр ярхярюцхссюрр. 3. Пюфъыючрхьых фрщыы Пюфъыючрхьыщ фрщы этю фрщы, сюфхрцрщшщ юярхфхыхэшя фуэъцшщ ш яхрхьхээых, р тръцх ьрърююярхфхыхэшя тьхстх с эхъютюрыьш шсхюфэыьш фрщырьш. Дыя шсяюыьчютрэшя т ярюуррььх яюфъыючрхьых фрщыют яршьхэяхтся фшрхътштр ярхярюцхссюрр '#include'. 3.1. Исяюыьчютрэшх яюфъыючрхьых фрщыют. Пюфъыючрхьых фрщыы шсяюыьчуются фыя фтух цхыхщ: Сшстхьэых яюфъыючрхьых фрщыы шсяюыьчуются фыя юярхфхыхэшя шэтхрфхщсют ъ сюстртыяющшь юяхррцшюээющ сшстхьы. Оэш яюфъыючрются фыя ярхфюстртыхэшя юсъятыхэшщ ш юярхфхыхэшщ, трхсухьых фыя ррсюты с сшстхьэыьш тычютрьш ш сшсышютхърьш. Пюфъыючрхьых фрщыы яюыьчютртхыя сюфхрцрт юярхфхыхэшя фыя шэтхрфхщсют ьхцфу шсхюфэыьш фрщырьш ярюуррььы. Въыючхэшх яюфъыючрхьюую фрщыр т ярюуррььу фрхт тръющ цх рхчуыьтрт, ъръ ярш ъюяшрютрэшш этюую фрщыр т ърцфыщ шсхюфэыщ фрщы этющ ярюуррььы. Пюфюсэюх ъюяшрютрэшх чрэшьрхт ьэюую трхьхэш ш яюсуцфрхт тючэшъэютхэшх юшшсюъ. Прш шсяюыьчютрэшш яюфъыючрхьых фрщыют тсх юсъятыхэшя ш юярхфхыхэшя яхрхьхээых ш фуэъцшщ эрхюфятся т юфэюь фрщых ш ярш эхюсхюфшьюстш ьюуут сыть шчьхэхэы. Осычэю яюфъыючрхьых фрщыы чрърэчштрются эр '.h' ш сыхфухт шчсхурть шсяюыьчютрэшя фруушх стрэфрртют. 3.2. Дшрхътштр '#include'. Кръ фрщыы яюыьчютртхыя, тръ ш сшстхьэых фрщыы тъыючрются т ярюуррььу с шсяюыьчютрэшхь фшрхътшты ярхярюцхссюрр '#include'. Оэр шьххт трш ьюфшфшърцшш: '#inхустX¶Е clude ' Этр ьюфшфшърцшя шсяюыьчухтся фыя яюфъыючхэшя сшстхьэых фрщыют. Прш хх тыяюыэхэшш ярюшчтюфштся яюшсъ фрщыр с шьхэхь FILE т сяшсъх уърчрээых чрррэхх ъртрыюуют, р чртхь т стрэфрртэюь сяшсъх сшстхьэых ъртрыюуют. С яюьющью юяцшш '-I' уърчытрются ъртрыюуш фыя яюшсър яюфъыючрхьых фрщыют. Ояцшя '-nostdinc' чрярхщрхт яюшсъ т стрэфрртэых сшстхьэых ъртрыюурх ш ярюшчтюфшт яюшсъ тюыьъю т уърчрээых ъртрыюурх. Сшэтръсшс тръющ ьюфшфшърцшш фшрхътшты '#include' фютюыьэю сяхцшфшчхэ, яютюьу ъръ ъюььхэтрршш тэутрш '' эх ррсяючэрются. Пюэтюьу т стрюъх '#include ' яюсыхфютртхыьэюсть сшьтюыют '/*' эх эрчшэрхт ъюььхэтрршщ, р уърчрээря фшрхътштр тъыючрхт т ярюуррььу фрщы с шьхэхь 'x/*y'. Арууьхэт FILE эх ьюцхт сюфхрцрть сшьтюыр '>', хютя юэ ьюцхт сюфхрцрть сшьтюы ' сыы фрщы, шья ьрърюср фюыцэю сюфхрцрть шья фрщыр ш эхъютюрыщ фюяюыэштхыьэыщ тхъст тю шчсхцрэшх тючэъэютхэшя ъюэфышътют с фруушьш яюфъыючрхьыьш фрщырьш. Прхярюцхссюр GNU C яюстрюхэ тръшь юсррчюь, чтю юсррсютъх яюфъыючрхьюую фрщыр юэ ярютхряхт эрышчшх юярхфхыхээых ъюэструъцшщ ш эршсюыхх ррцшюэрыьэю шх юсррсртытрхт. Прхярюцхссюр сяхцшрыьэю ютьхчрхт яюыэюх тыюцхэшх фрщыр т усыютшх '#ifndef'. Есыш т яюфъыючрхьюь фрщых сюфхрцштся фшрхътштр '#include', уърчытрющря эр юсррсртытрхьыщ фрщы, шыш ьрърюс т фшрхътштх '#ifndef' уцх юярхфхыхэ, тю юсррсртытрхьыщ фрщы яюыэюстью шуэюршрухтся. Сущхсттухт тръцх сяхцшрыьэря фшрхътштр, уърчытрющря ярхярюцхссюру, чтю фрщы фюыцхэ сыть тъыючхэ эх сюыхх юфэюую ррчр. Этр фшрхътштр эрчытрхтся '#pragma once'. Оэр шсяюыьчютрырсь т фюяюыэхэшх ъ фшрхътштх '#ifndef' ш т эрстюящхх трхья юэр устррхыр ш эх фюыцэр ярьхэяться. В юсъхътэю юршхэтшрютрээюь ячыъх С сущхсттухт ьюфшфшърцшя фшрхътшты '#include', эрчытрхьря '#import', ъютюрря шсяюыьчухтся фыя тъючхэшя фрщыр эх сюыхх юфэюую ррчр. Прш шсяюыьчютрэшш фшрхътшты '#import' тьхстю '#include' эх трхсухтся эрышчшя усыютэых юсюрютют фыя ярхфюттррщхэшя ьэюуюърртэющ юсррсютъш фрщыр. 3.5. Пюфъыючрхьых фрщыы ш эрсыхфютрэшх "Нрсыхфютрэшх" этю тю, чтю ярюшсхюфшт, ъюуфр ъръющ ышсю юсъхът шыш фрщы юсррчухт эхъютюрую чрсть стюхую сюфхрцшьюую яутхь тшртурыьэюую ъюяшрютрэшя шч фрууюую юсъхътр шыш фрщыр. В сыучрх яюфъыючрхьых С фрщыют эрсыхфютрэшх ючэрчрхт, чтю юфшэ фрщы тъыючрхт фруующ фрщы, р чртхь чрьхэяхт шыш фюсртыяхт чтю-ышсю. Есыш эрсыхфухьыщ яюфъыючрхьыщ фрщы ш юсэютэющ яюфъыючрхьыщ фрщы шьхют ррчышчэых шьхэр, тю тръюх эрсыхфютрэшх эрчытрхтся яряьыь. Прш этюь шсяюыьчухтся ъюэструъцшя '#include "BASE"' т эрсыхфухьюь фрщых. Иэюуфр эхюсхюфшью чтюсы у эрсыхфухьюую ш юсэютэюую яюфъыючрхьюую фрщыр сыыш юфшэръютых шьхэр. Нряршьхр, ярхфяюыюцшь, чтю яршъырфэря ярюуррььр шсяюыьчухт сшстхьэыщ яюфъыючрхьыщ фрщы 'sys/signal.h', эю тхрсшя фрщыр '/usr/include/sys/signal.h' эр фрээющ сшстхьх тыяюыэяхт тюую, чтю трхсухтся т яршъырфэющ ярюуррььх. Буфхт уфюсэхх юярхфхышть ыюърыьэую тхрсшю, тючьюцэю с шьхэхь '/usr/local/include/sys/signal.h' фыя чрьхэы шыш фюсртыхэшя ъ тхрсшш, яюстртыяхьющ с сшстхьющ. Этю ьюцэю тыяюыэшть с яршьхэхэшхь юяцшш '-I.' ярш ъюьяшыяцшш, р тръцх сючфрэшхь фрщыр 'sys/signal.h' ъютюрыщ тыяюыэяхт трхсухьых ярюуррььх фуэъцшш. Ню сфхырть тръ, чтюсы этют фрщы тъыючры стрэфрртэыщ фрщы 'sys/signal.h' эх тръ ярюстю. Прш тъыючхэшш стрюъш '#include ' т этют фрщы ярюшчющфхт яюфъыючхэшх эютющ тхрсшш фрщыр, р эх стрэфрртэющ сшстхьэющ тхрсшш. Этю ярштхфхт ъ рхъурсшш ш юшшсъх ярш ъюьяшыяцшш. Прш шсяюыьчютрэшш фшрхътшты `#include ' эуцэыщ фрщы суфхт эрщфхэ, эю этют сяюсюс ятыяхтся эх эфхътштэыь, тръ ъръ сюфхрцшт яюыэыщ яуть ъ сшстхьэюьу фрщыу. Этю ьюцхт ютррчшться эр сюфхрцрэшш сшстхьы, тръ ъръ этю ючэрчрхт, чтю ыюсых шчьхэхэшя ьхстюяюыюцхэшя сшстхьэых фрщыют яютрхсуют фюяюыэштхыьэых шчьхэхэшщ уфх-ышсю хщх. Бюыхх эффхътштэыь рхшхэшхь этющ ярюсыхьы ятыяхтся яршьхэхэшх фшрхътшты '#include_next', ъютюрря шсяюыьчухтся фыя яюфъыючхэшя сыхфующхую фрщыр с тръшь цх шьхэхь. Этр фшрхътштр фуэъцшюэшрухт тръцх ъръ ш фшрхътштр '#include' чр шсъыючхэшхь яюшсър трхсухьюую фрщыр. Оэр эрчшэрхт яюшсъ сяшсър ъртрыюуют яюфъыючрхьых фрщыют яюсых ъртрыюур, уфх сыы эрщфхэ тхъущшщ фрщы. Прхфяюыюцшь сыыр уърчрэр юяцшя '-I /usr/local/include', р сяшсюъ ъртрыюуют фыя яюшсър тъыючрхт '/usr/include'. Тръцх ярхфяюыюцшь, чтю юср ъртрыюур сюфхрцрт фрщы с шьхэхь 'sys/signal.h'. Дшрхътштр '#include ' эрщфхт эуцэыщ фрщы яюф ъртрыюуюь '/usr/local/include'. Есыш этют фрщы сюфхрцшт стрюъу '#include_next ', тю яюшсъ суфхт тючюсэютыхэ яюсых ярхфыфущхую ъртрыюур ш суфхт эрщфхэ фрщы т ъртрыюух '/usr/include'. 4. Мрърюсы Мрърюс этю тшя сюъррщхэшя, ъютюрыщ ьюцэю чрррэхх юярхфхышть ш шсяюыьчютрть т фрыьэхщшхь. Сущхсттухт фютюыьэю ьэюую тючьюцэюстхщ, стячрээых с шсяюыьчютрэшхь ьрърюсют т С ярхярюцхссюрх. 4.1. Прюстых ьрърюсы "Прюстющ ьрърюс" этю тшя сюъррщхэшя. Этю шфхэтшфшъртюр, ъютюрыщ шсяюыьчухтся фыя ярхфстртыхэшя фрруьхэтр ъюфр. Пхрхф шсяюыьчютрэшхь ьрърюср хую эхюсхюфшью юярхфхышть с яюьющью фшрхътшты '#define', чр ъютюрющ сыхфухт эрчтрэшх ьрърюср ш фрруьхэт ъюфр, ъютюрыщ суфхт шфхэтшфшцшрютрть этют ьрърюс. Нряршьхр, #define BUFFER_SIZE 1020 юярхфхыяхт ьрърюс с шьхэхь 'BUFFER_SIZE', ъютюрюьу сююттхтсттухт тхъст '1024'. Есыш уфх-ышсю яюсых этющ фшрхътшты тстрхтштся тыррцхэшх т сыхфующхщ фюрьх: foo = (char *) xmalloc (BUFFER_SIZE); тю С ярхярюцхссюр юярхфхышт ш чрьхэшт ьрърюс 'BUFFER_SIZE' эр хую чэрчхэшх ш т рхчуыьтртх яюыучштся foo = (char *) xmalloc (1020); Исяюыьчютрэшх ярюяшсэых суът т эрчтрэшях ьрърюсют ятыяхтся стрэфрртэыь сюуыршхэшхь ш яютышрхт чштрсхыьэюсть ярюуррьь. Осычэю, ьрърююярхфхыхэшхь фюыхустX¶Е цэр сыть ютфхыьэря стрюър, ъръ ш ярш шсяюыьчютрэшш тсхх фшрхътшт ярхярюцхссюрр. (Дышээюх ьрърююярхфхыхэшх ьюцэю ррчсшть эр эхсъюыьъю стрюъ с яршьхэхэшхь яюсыхфютртхыьэюстш backslash-newline.) Хютя сущхсттухт юфэю шсъыючхэшх: сшьтюыы яхрхтюфр стрюъш ьюуут сыть тъючхэы т ьрърююярхфхыхэшх хсыш юэш эрхюфятся т стрюъютющ шыш сшьтюыьэющ ъюэстрэтх, яютюьу ъръ ьрърююярхфхыхэшх эх ьюцхт сюфхрцрть ъръшх-ышсю сяхцшрыьэых сшьтюыют. Мрърююярхфхыхэшх рттюьртшчхсъш фюяюыэяхтся сююттхтсттующшь сяхцшрыьэыь сшьтюыюь, ъютюрыщ чртхршрхт стрючэую шыш сшьтюыьэую ъюэстрэту. Кюььхэтрршш т ьрърююярхфхыхэшях ьюуут сюфхрцрть сшьтюыы яхрхтюфр стрюъш, тръ ъръ этю эш эр чтю эх тышяхт, яютюьу ъръ тсх ъюььхэтрршш яюыэюстью чрьхэяются ярюсхырьш тэх чртшсшьюстш ют тюую, чтю юэш сюфхрцрт. В ютышчшх ют тышх сърчрээюую, эх сущхсттухт эшъръшх юуррэшчхэшщ эр чэрчхэшх ьрърюср. Съюсъш эх юсячртхыьэю фюыцэы чрърытрться. Тхыю ьрърюср эх юсячртхыьэю фюыцэю сюфхрцрть ярртшыьэыщ С ъюф. Прхярюцхссюр С юсррсртытрхт ярюуррььу яюсыхфютртхыьэю, яюэтюьу ьрърююярхфхыхэшя тстуярют т сшыу тюыьъю т ьхстрх, уфх юэш шсяюыьчуются. Пюэтюьу, яюсых юсррсютъш сыхфующшх фрээых С ярхярюцхссюрюь foo = X; #define X 4 bar = X; яюыучштся тръющ рхчуыьтрт foo = X; bar = 4; Пюсых яюфстрэютъш ярхярюцхссюрюь шьхэш ьрърюср, тхыю ьрърююярхфхыхэшя фюсртыяхтся ъ эрчрыу юстртшшхся ттюфшьых фрээых ш ярюшсхюфшт ярютхрър эр ярюфюыцхэшх тычютют ьрърюсют. Пюэтюьу тхыю ьрърюср ьюцхт сюфхрцрть ссыыъш эр фруушх ьрърюсы. Нряршьхр, яюсых тыяюыэхэшя #define BUFSIZE 1020 #define TABLESIZE BUFSIZE чэрчхэшхь ьрърюср 'TABLESIZE' стрэхт т рхчуыьтртх чэрчхэшх '1020'. Этю эх ятыяхтся тхь цх, чтю ш юярхфхыхэшх ьрърюср 'TABLESIZE' рртэыь чэрчхэшю '1020'. Дшрхътштр '#define' фыя ьрърюср 'TABLESIZE' шсяюыьчухт т тючэюстш тх фрээых, ъютюрых сыыш уърчрэы т хх тхых ш чрьхэяхт ьрърюс 'BUFSIZE' эр хую чэрчхэшх. 4.2. Мрърюсы с ррууьхэтрьш Зэрчхэшх ярюстюую ьрърюср тсхуфр юфэю ш тю цх ярш ърцфюь хую шсяюыьчютрэшш. Мрърюсы ьюуут сыть сюыхх ушсъшьш, хсыш юэш яршэшьрют ррууьхэты. Арууьхэтрьш ятыяются фрруьхэты ъюфр, ъютюрых яршырурются ярш ърцфюь шсяюыьчютрэшш ьрърюср. Этш фрруьхэты тъыючрются т ррсшшрхэшх ьрърюср т сююттхтсттшш с уърчрэшяьш т ьрърююярхфхыхэшш. Дыя юярхфхыхэшя ьрърюср, шсяюыьчующхую ррууьхэты, яршьхэяхтся фшрхътштр '#define' сю сяшсъюь шьхэ ррууьхэтют т съюсърх яюсых шьхэш ьрърюср. Иьхэрьш ррууьхэтют ьюуут сыть ыюсых ярртшыьэых С шфхэтшфшъртюры, ррчфхыхээых чряятыьш ш, тючьюцэю, ярюсхырьш. Отърытрющряся съюсър фюыцэр сыхфютрть сррчу цх яюсых шьхэш ьрърюср схч ъръшх-ышсю ярюсхыют. Нряршьхр, фыя тычшсыхэшя ьшэшьрыьэюую чэрчхэшя шч фтух чрфрээых ьюцэю шсяюыьчютрть сыхфующшщ ьрърюс: #define min(X, Y) ((X) т), тю этю эх ятыяхтся тычютюь ьрърюср ш ярхярюцхссюр эх шчьхэяхт тхъст ярюуррььы. Пюэтюьу тючьюцэю шсяюыьчютрэшх ьрърюср, яхрхьхээющ ш фуэъцшш с юфэшь шьхэхь ш т ърцфюь сыучрх ьюцэю шчьхэять, ъюуфр эуцэю яршьхэшть ьрърюс (хсыш чр шьхэхь сыхфухт сяшсюъ ррууьхэтют), р ъюуфр - яхрхьхээую шыш фуэъцшю (хсыш сяшсюъ ррууьхэтют ютстутсттухт). Пюфюсэюх фтющсттхээюх шсяюыьчютрэшх юфэюую шьхэш ьюцхт ярштхстш ъ юсыюцэхэшяь ш хую сыхфухт шчсхурть, чр шсъыючхэшхь сыучрхт, ъюуфр юср чэрчхэшя ятыяются сшэюэшьрьш, тю хсть ъюуфр яюф юфэшь шьхэхь юярхфхыхэр фуэъцшя ш ьрърюс ш юср тыяюыэяют юфшэръютых фхщсттшя. Мюцэю ррссьртрштрть этю шья ъръ шья фуэъцшш. Исяюыьчютрэшх шьхэш эх фыя ссыыъш (эряршьхр, фыя яюыучхэшя рфрхср) ярштхфхт ъ тычюту фуэъцшш, т тю трхья ъръ ссыыър ярштхфхт ъ чрьхэх шьхэш эр чэрчхэшх ьрърюср ш т рхчуыьтртх суфхт яюыучхэ сюыхх эффхътштэыщ эю шфхэтшчэыщ ъюф. Нряршьхр, шсяюыьчухтся фуэъцшя с шьхэхь 'min' т тюь цх шсхюфэюь фрщых, уфх юярхфхыхэ ьрърюс с тхь цх шьхэхь. Есыш эряшсрть '&min' схч сяшсър ррууьхэтют, тю этю ярштхфхт ъ тычюту фуэъцшш. Есыш цх эряшсрть 'min (x, bb)' сю сяшсъюь ррууьхэтют, тю тьхстю этюую суфхт ярюшчтхфхэр чрьхэр эр чэрчхэшх сююттхтсттующхую ьрърюср. Есыш шсяюыьчютрть ъюэструъцшю '(min) (a, bb)', уфх чр шьхэхь 'min' эх сыхфухт ютърытрющряся съюсър, тю суфхт ярюшчтхфхэ тычют фуэъцшш 'min'. Нхыьчя юярхфхыять ярюстющ ьрърюс ш ьрърюс с ррууьхэтрьш с юфэшь шьхэхь. В юярхфхыхэшш ьрърюср с ррууьхэтрьш сяшсюъ ррууьхэтют фюыцхэ сыхфютрть сррчу яюсых шьхэш ьрърюср схч ярюсхыют. Есыш яюсых шьхэш ьрърюср стюшт ярюсхы, тю ьрърюс юярхфхыяхтся схч ррууьхэтют, р юстрыьэря чрсть стрюъш стрэютштся чэрчхэшхь ьрърюср. Пршчшэющ этюьу ятыяхтся тю, чтю фютюыьэю чрстю юярхфхыяются ьрърюсы схч ррууьхэтют. Оярхфхыхэшх ьрърюсют яюфюсэыь юсррчюь яючтюыяхт тыяюыэять тръшх юяхррцшш ъръ #define FOO(x) - 1 / (x) (уфх юярхфхыяхтся ьрърюс 'FOO', яршэшьрющшщ юфшэ ррууьхэт ш фюсртыяхт ьшэус ъ чшсыу, юсрртэюьу ррууьхэту) шыш #define BAR (x) - 1 / (x) (уфх юярхфхыяхтся ьрърюс 'BAR' схч ррууьхэтют ш шьхющшщ яюстюяээюх чэрчхэшх '(x) - 1 / (x)'). 4.3. Зрррэхх юярхфхыхээых ьрърюсы Нхъютюрых ярюстых ьрърюсы ятыяются чрррэхх юярхфхыхээыьш. Их ьюцэю яршьхэять схч ярхфтррштхыьэюую юярхфхыхэшя. Оэш ррчфхыяются эр фтр ъырсср: стрэфрртэых ьрърюсы ш сшстхьэю-чртшсшьых ьрърюсы. 4.3.1. Стрэфрртэых чрррэхх юярхфхыхээых ьрърюсы Стрэфрртэых чрррэхх юярхфхыхээых ьрърюсы ьюуут яршьхэяться тэх чртшсшьюстш ют шсяюыьчухьющ яыртфюрьы шыш юяхррцшюээющ сшстхьы эр ъютюрющ фуэъцшюэшрухт GNU C. Их шьхэр эрчшэрются ш чрърэчштрются фтющэыь сшьтюыюь яюфчхръштрэшя. Всх ьрърюсы т сыхфующхь сяшсъх фю '__GNUC__' ятыяются стрэфрртшчшрютрээыьш ANSI C. Острыьэых ьрърюсы ятыяются ррсшшрхэшяьш GNU C. '__FILE__' Этют ьрърюс чрьхэяхтся эр шья тхъущхую шсхюфэюую фрщыр т фюрьх стрюъютющ ъюэстрэты С. Вючтррщрхьыь шьхэхь ятыяхтся юфэю шч уърчрээых т фшрхътштх '#include' шыш шья юсэютэюую шсхюфэюую фрщыр. '__LINE__' Этют ьрърюс чрьхэяхтся эр эюьхр тхъущхщ стрюъш т фюрьх фхсятшчэющ цхыющ ъюэстрэты. В тю трхья ъръ юэ эрчытрхтся чрррэхх юярхфхыхээыь ьрърюсюь, хую чэрчхэшх ьхэяхтся фшэрьшчхсъш. Этют ьрърюс ш ьрърюс '__FILE__' шсяюыьчуются ярш ухэхршрютрэшш сююсщхэшя юс юшшсъх фыя тытюфр эхсююттхтсттшя, юярхфхыхээюую ярюуррььющ. Сююсщхэшх ьюцхт сюфхрцрть эюьхр стрюъш шсхюфэюую фрщыр уфх сыыр юсэрруцхэр юшшсър. Нряршьхр, fprintf (stderr, "Internal error: " "negative string length " "%d at %s, line %d.", length, __FILE__, __LINE__); Дшрхътштр '#include' шчьхэяхт чэрчхэшя ьрърюсют '__FILE__' ш '__LINE__' эр сююттхтсттующшх шсхюфэюьу фрщыу. В ъюэцх этюую фрщыр, хсыш этю сыы яюфъыючрхьыщ фрщы, чэрчхэшя '__FILE__' ш '__LINE__' стрэютятся тхьш, ъръшьш юэш сыыш фю фшрхътшты '#include' (тюыьъю чэрчхэшх '__LINE__' утхышчштрхтся эр хфшэшцу, тръ ъръ чртхь юсррсртытрхтся стрюър, сыхфующря чр фшрхътштющ '#include'). Зэрчхэшя '__FILE__' ш '__LINE__' шчьхэяются ярш шсяюыьчютрэшш фшрхътшты '#line'. '__DATE__' Этют ьрърюс чрьхэяхтся эр стрючэую ъюэстрэту, ъютюрря уърчытрхт фрту чряусър ярхярюцхссюрр. Этр ъюэстрэтр сюфхрцшт юфшэрфцрть сшьтюыют ш тыуыяфшт яршьхрэю тръ '"Jan 29 1987"' шыш '"Apr 1 1905"'. '__TIME__' Этют ьрърюс чрьхэяхтся эр стрюъютую ъюэстрэту, ъютюрря уърчытрхт трхья чряусър ярхярюцхссюрр. Кюэстрэтр сюфхрцшт тюсхьь сшьтюыют ш тыуыяфшт яршьхрэю тръ: '"23:59:01:'. '__STDC__' Этют ьрърюс чрьхэяхтся эр ъюэстрэту сю чэрчхэшхь 1 фыя уърчрэшя, чтю этю С стрэфрртр ANSI. '__STDC_VERSION__' Этют ьрърюс чрьхэяхтся эр эюьхр тхрсшш стрэфрртр С, фышээющ цхыющ ъюэстрэтющ т фюрьх 'YYYYMML', уфх YYYY ш MM уюф ш ьхсяц тыхюфр тхрсшш стрэфрртр. Этю уърчытрхт эр тхрсшю стрэфрртр С, ъ ъютюрющ ютэюсштся ярхярюцхссюр. '__GNUC__' Этют ьрърюс юярхфхыхэ тюуфр ш тюыьъю тюуфр, ъюуфр шсяюыьхустX¶Е чухтся GNU C. Оэ юярхфхыхэ тюыьъю тюуфр шсяюыьчухтся яюыэыщ GNU C ъюьяшыятюр. Есыш тычтрть ярхярюцхссюр ютфхыьэю, тю этют ьрърюс суфхт эх юярхфхыхэ. Еую чэрчхэшх уърчытрхт эр юсэютэющ эюьхр тхрсшш GNU CC ('1' фыя тхрсшш 1 GNU CC, ъютюрря уцх ятыяхтся устррхтшхщ, ш '2' фыя тхрсшш 2). '__GNUC_MINOR__' Этют ьрърюс сюфхрцшт фюяюыэштхыьэыщ эюьхр тхрсшш ъюьяшыятюрр. Оэ ьюцхт сыть шсяюыьчютрэ ярш ррсютх с ютышчштхыьэыьш тючьюцэюстяьш ррчышчэых тыяусъют ъюьяшыятюрр. '__GNUG__' Кюьяшыятюр GNU C юярхфхыяхт этют ьрърюс хсыш ъюьяшышрухьыь ячыъюь ятыяхтся С++. '__cplusplus' Стрэфррт ANSI фыя С++ ррэьшх трхсютры юярхфхыхэшя этющ яхрхьхээющ. Хютя хх эрышчшх сюыьшх эх трхсухтся, т GNU C++ юэр тсх хщх юярхфхыяхтся, ъръ ш т фруушх шчтхстэых ъюьяшыятюррх С++. Этют ьрърюс ьюцхт сыть шсяюыьчютрэ фыя юярхфхыхэшя ъръшь ъюьяшыятюрюь сыы съюьяшышрютрэ чруюыютюъ (С шыш С++). '__STRICT_ANSI__' Этют ьрърюс юярхфхыяхтся тюуфр ш тюыьъю тюуфр, ъюуфр ярш тычютх GNU C уърчытрхтся юяцшя '-ansi'. Оэ юярхфхыяхтся ъръ яустря стрюър. '__BASE_FILE__' Этют ьрърюс чрьхэяхтся эр шья юсэютэюую шсхюфэюую фрщыр т фюрьх стрюъютющ ъюэстрэты С. Этю шсхюфэыщ фрщы, уърчытрхьыщ т ърчхсттх ярррьхтрр ярш тычютх ъюьяшыятюрр С. '__INCLUDE_LEVEL__' Этют ьрърюс чрьхэяхтся эр фхсятшчэую цхыую ъюэстрэту, ъютюрря уърчытрхт эр урютхэь тыюцхээюстш яюфъыючрхьых фрщыют. Еую чэрчхэшх утхышчштрхтся эр хфшэшцу ярш юсррсютъх фшрхътшты '#include' ш уьхэьшрхтся эр хфшэшцу ярш чртхршхэшш юсррсютъш ърцфюую фрщыр. Нрчрыьэюх чэрчхэшх фыя фрщыют, уърчытрхьых т ъюьрэфэющ стрюъх ярш тычютх ъюьяшыятюрр ятыяхтся рртэыь эуыю. '__VERSION__' Этют ьрърюс чрьхэяхтся стюрюъющ, уърчытрющхщ эюьхр тхрсшш GNU C. Осычэю этю яюсыхфютртхыьэюсть фхсятшчэых чшсхы, ррчфхыхээых тючърьш. Нряршьхр '"2.6.0"'. '__OPTIMIZE__' Этют ьрърюс юярхфхыяхтся т юятшьшчшрующшх ъюьяшыятюррх. Есыш эю юярхфхыхэ, тю этю ярштюфшт ъ сючфрэшю т яюфъыючрхьых фрщырх GNU рыьтхрэртштэых ьрърююярхфхыхэшщ фыя эхъютюрых фуэъцшщ шч сшстхьэых сшсышютхъ. Прютхрър шыш шсяюыьчютрэшх чэрчхэшя этюую ьрърюср эх шьххт юсюсюую сьысыр, фю тхх яюр, яюър эх суфхт яюыэющ утхрхээюстш т тюь, чтю ярюуррььы суфут тыяюыэяться с тръшь цх эффхътюь. '__CHAR_UNSIGNED__' Этют ьрърюс юярхфхыяхтся тюуфр ш тюыьъю тюуфр, ъюуфр тшя фрээых 'char' ятыяхтся схччэръютыь. Оэ рхрышчютрэ фыя ярртшыьэюую фуэъцшюэшрютрэшя яюфъыючрхьюую фрщыр 'limit.h'. Нх сыхфухт шсяюыьчютрть этют ьрърюс. Вьхстю этюую ьюцэю шсяюыьчютрть стрэфрртэых ьрърюсы, юярхфхыхээых т фрщых 'limit.h'. Прхярюцхссюр шсяюыьчухт этют ьрърюс фыя юярхфхыхэшя эхюсхюфшьюстш т фюсртыхэшш чэръютюую сштр т сюыьшшх тюсььхршчэых сшьтюыьэых ъюэстрэтрх. '__REGISTER_PREFIX__' Этют ьрърюс чрьхэяхтся эр срюъу, юяшсытрющую ярхфшъс, фюсртыяхьыщ ъ юсючэрчхэшю рхушстрют ярюцхссюрр т рссхьсыхрэюь ъюфх. Оэ ьюцхт шсяюыьчютрться фыя эряшсрэшя рссхьсыхрэюую ъюфр, фуэъцшюэшрующхую т ррчышчэых юсюыючърх. Нряршьхр, т юсюыючъх 'm68k-aout' ярюшчтюфштся чрьхэр эр стрюъу '""', р т юсюыючъх 'm68k-coff' ьрърюс чрьхэяхтся эр стрюъу '"%"'. '__USER_LABEL_PREFIX__' Этют ьрърюс чрьхэяхтся эр стрюъу, юяшсытрющую ярхфшъс, фюсртыяхьыщ ъ ьхтърь яюыьчютртхыя т рссхьсыхрэюь ъюфх. Оэ ьюцхт шсяюыьчютрться фыя эряшсрэшя рссхьсыхрэюую ъюфр, фуэъцшюэшрующхую т ррчышчэых юсюыючърх. Нряршьхр, т юсюыючъх 'm68k-out' юэ чрьхэяхтся эр стрюъу '" "', р т юсюыючъх 'm68k-coff' - эр стрюъу '""'. 4.3.2. Нхстрэфрртэых чрррэхх юярхфхыхээых ьрърюсы Осычэю С ярхярюцхссюр шьххт эхсъюыьъю чрррэхх юярхфхыхээых ьрърюсют, чэрчхэшя ъютюрых ррчышчрются т чртшсшьюстш ют шсяюыьчухьющ яыртфюрьы ш юяхррцшюээющ сшстхьы. В фрээюь руъютюфсттх эх ярхфстртыяхтся тючьюцэыь ррссьютрхть тсх ьрърюсы. Зфхсь юяшсрэы тюыьъю эршсюыхх тшяшчэых шч эшх. Дыя ярюсьютрр чэрчхэшщ чрррэхх юярхфхыхээых ьрърюсют ьюцэю тюсяюыьчютрться ъюьрэфющ 'cpp -dM'. Нхъютюрых эхстрэфрртэых чрррэхх юярхфхыхээых ьрърюсы сюыхх шыш ьхэхх яюфрюсэю юяшсытрют тшя шсяюыьчухьющ юяхррцшюээющ сшстхьы. Нряршьхр, 'unix' Этют ьрърюс юсычэю юярхфхыхэ эр тсхх сшстхьрх Unix. 'BSD' Этют ьрърюс юярхфхыхэ эр яюсыхфэшх тхрсшях сшстхьы Berkley Unix (тючьюцэю тюыьъю т тхрсшш 4.3). Друушх ьрърюсы юяшсытрют тшя цхэтррыьэюую ярюцхсюрр. Нряршьхр, 'vax' Оярхфхыхэ эр Vax ъюьяьютхррх. 'mc68000' Оярхфхыхэ эр сюыьшшэсттх ъюьяьютхрют, шсяюыьчующшх ярюцхссюр Motorola 68000, 68010 шыш 68020. 'm68k' Тръцх юярхфхыхэ эр сюыьшшэсттх ъюьяьютхрют с ярюцхссюрюь 68000, 68010 шыш 68020. Хютя эхъютюрых ррчррсютчшъш шсяюыьчуют 'mc68000', р эхъютюрых - 'm68k'. Нхъютюрых чрррэхх юярхфхыяют юср ьрърюср. 'M68020' Оярхфхыхэ эр эхъютюрых сшстхьрх с ярюцхссюрюь 68020 т фюяюыэхэшх ъ ьрърюсрь 'mc68000' ш 'm68k', ъютюрых ятыяются ьхэхх сяхцшфшчэыьш. '_AM29K' '_AM29000' Оярхфхыхэы эр ъюьяьютхррх с ярюцхссюррьш шч схьхщсттр AMD 29000. 'ns32000' Оярхфхыхэ эр ъюьяьютхррх, шсяюыьчующшхустX¶Е х ярюцхссюры схршш National Semiconductor 32000. Друушх эхстрэфрртэых ьрърюсы юяшсытрют шчуютютштхыхщ ъюьяьютхрэых сшстхь. Нряршьхр, 'sun' Оярхфхыхэ эр тсхх ьюфхыях ъюьяьютхрют Sun. 'pyr' Оярхфхыхэ эр тсхх ьюфхыях ъюьяьютхрют Pyramid. 'sequent' Оярхфхыхэ эр тсхх ьюфхыях ъюьяьютхрют Sequent. Этш чрррэхх юярхфхыхээых сшьтюыы ятыяются эх тюыьъю эхстрэфрртэыьш, эю юэш ъ тюьу цх эх сююттхтсттуют стрэфррту ANSI, яютюьу чтю шх шьхэр эх эрчшэрются с сшьтюыр яюфчхръштрэшя. Пюэтюьу юяцшя '-ansi' чрярхщрхт юярхфхыхэшх этшх сшьтюыют. Этю ярштюфшт ъ тюьу, чтю юяцшя '-ansi' стрэютштся схсяюыхчэющ, тръ ъръ сюыьшюх ъюышчхсттю ярюуррьь чртшсшт ют эхстрэфрртэых чрррэхх юярхфхыхээых сшьтюыют. Дрцх сшстхьэых яюфъыючрьых фрщыы ярютхряют шх чэрчхэшя ш ухэхршруют эхярртшыьэых юсъятыхэшя т сыучрх хсыш трхсухьых шьхэр эх юярхфхыхэы. В рхчуыьтртх ючхэь ьрыю ярюуррьь ъюьяшышрухтся с юяцшхщ '-ansi'. Чтю цх эуцэю сфхырть т ANSI C ярюуррььх фыя тюую, чтюсы ярютхршть тшя шсяюыьчухьюую ъюьяьютхрр? Дыя этющ цхыш GNU C ярхфюстртыяхт ярррыыхыьэую схршю сшьтюыют, шьхэр ъютюрых сюстюят шч юсычэых сшьтюыют с фюсртыхэшхь стрюъш '__' с эрчрыр ш с ъюэцр. Тръшь юсррчюь сшьтюы '__vax__' шсяюыьчухтся эр сшстхьрх Vax, ш тръ фрыхх. Нрсюр эхстрэфрртэых чрррэхх юярхфхыхээых сшьтюыют т GNU C ярхярюцхссюрх шчьхэяхтся (ярш ъюьяшыяцшш срьюую ъюьяшыятюрр) с яюьющью ьрърюср 'CPP_PREDEFINES', ъютюрыь ятыяхтся стрюър, сюстюящря шч юяцшщ '-D', ррчфхыхээых ярюсхырьш. Нряршьхр, эр сшстхьх Sun 3 шсяюыьчухтся сыхфующхх ьрърююярхфхыхэшх: #define CPP_PREDEFINES "-Dmc68000 -Dsun -Dunix -Dm68k" Этют ьрърюс юсычэю уърчытрхтся т фрщых 'tm.h'. 4.4. Стршэушфшърцшя "Стршэушфшърцшя" ючэрчрхт ярхюсррчютрэшх фрруьхэтр ъюфр т стрюъютую ъюэстрэту, ъютюрря сюфхрцшт тхъст этюую фрруьхэтр ъюфр. Нряршьхр, т рхчуыьтртх стршэушфшърцшш 'foo (z)' яюыучрхтся '"foo (z)"'. В С ярхярюцхссюрх, стршэушфшърцшя ятыяхтся юяцшхщ, шсяюыьчухьющ ярш чрьхэх ррууьхэтют т ьрърюсх ьрърююярхфхыхэшхь. Прш яюятыхэшш шьхэш ррууьхэтр т тхых ьрърююярхфхыхэшя, сшьтюы '#' яхрхф шьхэхь ррууьхэтр уърчытрхт эр стршэушфшърцшю сююттхтсттующхую ррууьхэтр ярш хую яюфстрэютъх т этюь ьхстх ьрърююярхфхыхэшя. Этют цх ррууьхэт ьюцхт сыть чрьхэхэ т фрууюь ьхстх ьрърююярхфхыхэшя схч хую стршэушфшърцшш, хсыш яхрхф шьхэхь ррууьхэтр эхт сшьтюыр '#'. Вют яршьхр ьрърююярхфхыхэшя с шсяюыьчютрэшхь стршэушфшърцшш: #define WARN_IF(EXP) \ do { if (EXP) \ fprintf (stderr, "Warning: " #EXP "\n"); } \ while (0) Зфхсь ррууьхэт 'EXP' чрьхэяхтся юфшэ ррч юсычэыь юсррчюь (т ъюэструъцшш 'if'), р фруующ - с шсяюыьчютрэшхь стршэушфшърцшш (ррууьхт фуэъцшш 'fprintf'). Кюэструъцшя 'do' ш 'while (0)' ятыяхтся рхрышчрцшхщ ьрърюср 'WARN_IF (ARG);'. Вючьюцэюстш сршэушфшърцшш юуррэшчхэы фю ярхюсррчютрэшя юфэюую ьрърю ррууьхэтр т юфэу стрюъютую ъюэстрэту: эх сущхсттухт ьхтюфют ъюьсшэшрютрэшя ррууьхэтр с фруушь тхъстюь ш яюссыхфующхщ стршэушфшърцшш яюыучхээых фрээых. Хютя ррссьютрхээыщ тышх яршьхр яюърчытрхт ъръ ьюцхт сыть фюстшуэут яюфюсэыщ рхчуыьтрт т стрэфрртэюь ANSI C с шсяюыьчютрэшхь тючьюцэюстш юсъхфшэхэшя сьхцэых стрюъютых ъюэстрэт т юфэу. Прхярюцхссюр стршэушфшцшрухт рхрыьэюх чэрчхэшх 'EXP' т ютфхыьэую стрюъютую ъюэстрэту ш т рхчуыьтртх яюыучрхтся сыхфующшщ тхъст: do { if (x == 0) \ fprintf (stderr, "Warning: " "x == 0" "\n"); } \ while (0) эю С ъюьяшыятюр юсэрруцштрхт трш стрюъютых ъюэстрэты, ррсяюыюцхээых фруу чр фрууюь ш юсъхфшэяхт шх т юфэу: do { if (x == 0) \ fprintf (stderr, "Warning: x == 0\n"); } \ while (0) Стршэушфшърцшя т С ятыяхтся эх тюыьъю чръыючхэшхь трхсухьюую тхъстр т ъртычъш. Нхюсхюфшью яюьхщрть сшьтюы backslash яхрхф ърцфыь фюяюыэштхыьэыь сшьтюыюь ъртычъш, р тръцх яхрхф ърцфыь сшьтюыюь backslash т сшьтюыьэющ шыш стрюъютющ ъюэстрэтх фыя яюыучхэшя стрюъютющ ъюэстрэты т стрэфрртх С. Пюэтюьу ярш стршэушфшърцшш чэрчхэшя 'p = "foo\n";' т рхчуыьтртх яюыучштся стрюър '"p = \"foo\\n\";"'. Офэръю сшьтюыы backslash, эх яршэрфыхцрщшх сшьтюыьэющ шыш стрюъютющ ъюэстрэтх, эх фусышруются: чэрчхэшх '\n' стршэушфшцшрухтся т '"\n"'. Прюсхыы (тъыючря ъюььхэтрршш), эрхюфящшхся т тхъстх, юсррсртытрются т сююттхтсттшш с устрэютыхээыьш ярртшырьш. Всх ярхфшхсттующшх ш яюсыхфующшх ярюсхыы шуэюршруются. Люсых яюсыхфютртхыьэюстш ярюсхыют т схрхфшэх тхъстр т рхчуыьтртх юсррсютъш чрьхэяются эр ютфхыьэыщ ярюсхы. 4.5. Осъхфшэхэшх "Осъхфшэхэшх" ючэрчрхт сюхфшэхэшх фтух стрюъютых ъюэстрэт т юфэу. Прш ррсютх с ьрърюсрьш, этю ючэрчрхт юсъхфшэхэшх фтух ыхъсшчхсъшх хфшэшц т юфэу сюыхх фышээую. Офшэ ррууьхэт ьрърюср ьюцхт сыть юсъхфшэхэ с фруушь ррууьхэтюь шыш с ъръшь-ышсю тхъстюь. Пюыучхээюх чэрчхэшх ьюцхт сыть шьхэхь фуэъцшш, яхрхьхээющ шыш тшяр, р тръцх ъыючхтыь сыютюь С. Оэю фрцх ьюцхт сыть шьхэхь фрууюую ьрърюср. Прш юярхфхыхэшш ьрърюср,хустX¶Е ярютхряхтся эрышчшх юяхрртюрют '##' т хую тхых. Прш тычютх ьрърюср ш яюсых яюфстрэютъш ррууьхэтют тсх юяхрртюры '##', р тръцх тсх ярюсхыы ряфюь с эшьш (тъыючря ярюсхыы, яршэрфыхцрщшх ррууьхэтрь) уфрыяются. В рхчуыьтртх ярюшчтюфштся юсъхфшэхэшх сшэтръсшчхсъшх ъюэструъцшщ с юсюшх стюрюэ юяхрртюрр '##'. Ррссьютршь С ярюуррььу, шэтхрярхтшрующую уърчытрхьых ъюьрэфы. Дыя этюую фюыцэр сущхсттютрть трсышцр ъюьрэф, тючьюцэю ьрссшт шч струътур, юяшсрээыщ сыхфующшь юсррчюь: struct command { char *name; void (*function) (); }; struct command commands[] = { { "quit", quit_command}, { "help", help_command}, ... }; Бюыхх уфюсэыь суфхт эх уърчытрть шья ърцфющ ъюьрэфы фтрцфы: юфшэ ррч т стрюъютющ ъюэстрэтх, ттюрющ - т шьхэш фуэъцшш. Мрърюс, яршэшьрющшщ т ърчхсттх ррууьхэтр шья ъюьрэфы яючтюыяхт шчсхцрть этю. Стрюъютря ъюэстрэтр ьюцхт сыть сючфрэр с яюьющью стршэушфшърцшш, р шья фуэъцшш - яутхь юсъхфшэхэшя ррууьхэтр сю стрюъющ '_command'. Ншцх яюърчрэю ъръ этю сфхырть: #define COMMAND(NAME) { #NAME, NAME ## _command } struct command commands[] = { COMMAND (quit), COMMAND (help), ... }; Осычэыь юсъхфшэхэшхь ятыяхтся юсъхфшэхэшх фтух шьхэ (шыш шьхэш ш ъръюую ышсю чшсыютюую чэрчхэшя) т юфэю. Тръцх тючьюцэю юсъхфшэхэшх фтух чшсыютых чэрчхэшщ (шыш чшсыютюую чэрчхэшя ш шьхэш) т юфэю. Ояхрртюры, сюстюящшх шч эхсъюыьъшх сшьтюыют (тръшх ъръ '+='), тръцх ьюуут сыть яюыучхэы с яюьющью юсъхфшэхэшя. В эхъютюрых сыучрях тючьюцэю юсъхфшэхэшх стрюъютых ъюэстрэт. Офэръю, фтр тхъстютых чэрчхэшя, эх юсррчующшх тьхстх ярртшыьэющ ыхъсшчхсъющ ъюэструъцшш, эх ьюуут сыть юсъхфшэхэы. Нряршьхр, юсъхфшэхэшх с юфэющ стюрюэы сшьтюыр 'x', р с фруующ - '+' ятыяхтся схссьысыхээыь с тючъш чрхэшя фюрьшрютрэшя ыхъсшчхсъшх ъюэструъцшщ С. В стрэфрртх ANSI уърчрэю, чтю яюфюсэыщ тшя юсъхфшэхэшя эх юярхфхыхэ, хютя ярхярюцхссюр GNU C шх юярхфхыяхт. В фрээюь сыучрх юэ яюьхщрхт тьхстх сшьтюыы 'x' ш '+' тьхстх схч ъръшх ышсю яюсючэых эффхътют. Сыхфухт чрьхтшть, чтю ярхярюцхссюр С ярхюсррчухт тсх ъюььхэтрршш т ярюсхыы яхрхф юсррсютъющ ьрърюсют. Пюэтюьу эхыьчя сючфрть ъюььхэтрршщ яутхь юсъхфшэхэшя '/' ш '*' тръ ъръ яюсыхфютртхыьэюсть сшьтюыют '/*' эх ятыяхтся ыхъсшчхсъющ ъюэструъцшхщ. Тръцх ьюцэю шсяюыьчютрть ъюььхэтрршш т ьрърююярхфхыхэшях яюсых стрюъш '##' шыш т юсъхфшэяхьых ррууьхэтрх, тръ ъръ сэрчрыр ъюььхэтрршш чрьхэяются эр ярюсхыы, р ярш юсъхфшэхэшш этш ярюсхыы шуэюршруются. 4.6. Уфрыхэшх ьрърюсют "Уфрышть" ьрърюс ючэрчрхт ютьхэшть хую юярхфхыхэшх. Этю ярюшчтюфштся с яюьющью фшрхътшты '#undef', чр ъютюрющ сыхфухт шья ьрърюср. Кръ ш юярхфхыхэшх, уфрыхэшх ьрърюсют яюятыяхтся т юярхфхыхээюь ьхстх шсхюфэюую фрщыр ш тстуярхт т сшыу с этюую ьхстр. Нряршьхр, #define FOO 4 x = FOO; #undef FOO x = FOO; чрьхэяхтся эр x = 4; x = FOO; В этюь яршьхрх чэрчхэшх 'FOO' фюыцэю сыть ыучшх яхрхьхээющ шыш фуэъцшхщ, чхь ьрърюсюь, фыя яюыучхэшя яюсых яюфстрэютъш ярртшыьэюую С ъюфр. Дшрхътштр '#undef' шсяюыьчухтся т тръющ цх фюрьх ш фыя ютьхэы ьрърююярхфхыхэшщ с ррууьхэтрьш шыш схч эшх. Пршьхэхэшх этющ фшрхътшты ъ эхюярхфхыхээюьу ьрърюсу эх фрхт эшъръюую эффхътр. 4.7. Пхрхюярхфхыхэшх ьрърюсют "Пхрхюярхфхыхэшх" ьрърюср ючэрчрхт юярхфхыхэшх (с яюьющью фшрхътшты '#include') шьхэш, ъютюрюх уцх сыыю юярхфхыхэю ъръ ьрърюс. Пхрхюярхфхыхэшх ятяыхтся ярюстыь, хсыш эютюх юярхфхыхэшх ятэю шфхэтшчэю стррюьу. Иэюуфр эх трхсухтся сяхцшрыьэю тыяюыэять ярюстюх яхрхюярхфхыхэшх, хютя юэю ярюшчтюфштся рттюьртшчхсъш, хсыш яюфъыючрхьыщ фрщы тъючрхтся сюыхх юфэюую ррчр, яюэтюьу юэю тыяюыэяхтся схч ъръюую-ышсю эффхътр. Нхтрштшрыьэых яхрхюярхфхыхэшя ррссьртрштрются ъръ тючьюцэря юшшсър, яюэтюьу т тръшх сыучрях ярхярюцхссюр тыфрхт ярхфуярхцфрющхх сююсщхэшх. Офэръю, этю шэюуфр яюьюурхт ярш шчьхэхэшш юярхфхыхэшя ьрърюср тю трхья ярхфтррштхыьэющ ъюьяшыяцшш. Пюятыхэшх ярхфуярхцфрющхую сююсщхэшя ьюцэю чрярхтшть яутхь ярхфтррштхыьэюую уэшчтюцхэшя ьрърюср с яюьющью фшрхътшты '#undef'. Дыя ярюстюую яхрхюярхфхыхэшя эютюх юярхфхыхэшх фюыэю тючэю сютярфрть с ярхфыфущшь чэрчхэшхь чр шсъыючхэшхь фтух сыучрхт: В эрчрых ш т ъюэцх юярхфхыхэшя ьюуут сыть фюсртыхэы шыш уфрыхэы ярюсхыы. Прюсхыы ьюцэю шчьхэять т схрхфшэх юярхфхыхэшя (эю эх т схрхфшэх стрюъш). Офэръю юэш эх ьюуут сыть яюыэюстью уфрыхэы, р тръцх эх ьюуут сыть тстртыхэы туфр, уфх шх эх сыыю тююсщх. 4.8. Осюсхээюстш шсяюыьчютрэшя ьрърюсют В этюь ррчфхых ррссьртрштрются эхъютюрых сяхцшрыьэых ярртшыр ррсюты, стячрээых с ьрърюсрьш ш ьрърюяюфстрэютърьш, р тръцх уърчытрются ютфхыьэых сыучрш, ъютюрых сыхфухт шьхть т тшфу. 4.8.1. Нхярртшыьэю шсяюыьчухьых ъюэструъцшш Прш тычютх ьрърюср с ррууьхэтрьш, юэш яюфстртыяются т тхыю ьрърюср, р чртхь ярюсьртрштрются яюыучхээых яюсых яюфстрэютъш фрээыхустX¶Е х тьхстх с юстртшхщся чрстью шсхюфэюую фрщыр эр ярхфьхт фюяюыэштхыьэых ьрърю тычютют. Вючьюцэю юсъхфшэхэшх ьрърю тычютр, шсхюфящхую чрстшчэю ют тхыр ьрърюср ш чрстшчэю - ют ррууьхэтют. Нряршьхр, #define double(x) (2*(x)) #define call_with_1(x) x(1) чфхсь стрюър 'call_with_1 (double)' суфхт чрьхэхэр эр '(2*(1))'. Мрърююярхфхыхэшя эх юсячртхыьэю фюыцэы шьхть чрърытрющшхся съюсъш. Путхь шсяюыьчютрэшя эх чрърытрющхщся съюсъш т тхых ьрърюср тючьюцэю сючфрэшх ьрърю тычютр, эрчшэрющхуюся т тхых ьрърюср ш чрърэчштрющхуюся тэх хую. Нряршьхр, #define strange(file) fprintf (file, "%s %d", ... strange(stderr) p, 35) В рхчуыьтртх юсррсютъш этюую стррээюую яршьхрр яюыучштся стрюър 'fprintf (stderr, "%s %d", p, 35)'. 4.8.2. Нхстрэфрртэря уруяяшрютър рршфьхтшчхсъшх тыррцхэшщ Вю сюыьшшэсттх яршьхрют ьрърююярхфхыхэшщ, ррссьютрхээых тышх, ърцфюх шья ьрърюррууьхэтр чръыючхэю т съюсъш. В фюяюыэхэшх ъ этюьу, фрууря яррр съюсюъ шсяюыьчухтся фыя чръыючхэшя т эшх тсхую ьрърююярхфхыхэшя. Дрыхх юяшсрэю, яючхьу ыучшх тсхую сыхфухт яшсрть ьрърюсы тръшь юсррчюь. Дюяустшь, сущхсттухт сыхфующхх ьрърююярхфхыхэшх: #define ceil_div(x, y) (x + y - 1) / y ъютюрюх шсяюыьчухтся фыя фхыхэшя с юърууыхэшхь. Зртхь ярхфяюыюцшь, чтю юэ шсяюыьчухтся сыхфующшь юсррчюь: a = ceil_div (b & c, sizeof (int)); В рхчуыьтртх этр стрюър чрьхэяхтся эр a = (b & c + sizeof (int) - 1) / sizeof (int); ъютюрря эх тыяюыэяхт трхсухьющ чрфрчш. Прртшыр яршюрштхтр юяхрртюрют С яючтюыяют эряшсрть сыхфующую срюъу: a = (b & (c + sizeof (int) - 1)) / sizeof (int); эю трхсухтся a = ((b & c) + sizeof (int) - 1)) / sizeof (int); Есыш юярхфхышть ьрърюс сыхфующшь юсррчюь: #define ceil_div(x, y) ((x) + (y) - 1) / (y) тю суфхт яюыучхэ цхырхьыщ рхчуыьтрт. Офэръю, эхстрэфрртэря уруяяшрютър ьюцхт ярштхстш ъ фрууюьу рхчуыьтрту. Ррссьютршь тыррцхэшх 'sizeof ceil_div(1, 2)'. Зфхсь шсяюыьчухтся тыррцхэшх С, тычшсыяющхх ррчьхр тшяр фрээых 'ceil_div(1, 2)', эю т фхщсттштхыьэюстш ярюшчтюфятся сютсхь шэых фхщсттшя. В фрээюь сыучрх уърчрээря срюър чрьхэяхтся эр сыхфующую: sizeof ((1) + (2) - 1) / (2) Зфхсь юярхфхыяхтся ррчьхр тшяр цхыюую чэрчхэшя ш фхыштся яюяюырь. Прртшыр яршюрштхтр яюьхщрют юяхррцшю фхыхэшя тэх яюыя фхщсттшя юяхррцшш 'sizeof', т тю трхья ъръ фюыцхэ юярхфхыяться ррчьхр тсхую тыррцхэшя. Зръыючхэшх т съюсъш тсхую ьрърююярхфхыхэшя яючтюыяхт шчсхцрть яюфюсэых ярюсыхь. Дрыхх фрэ ярртшыьэыщ яршьхр юярхфхыхэшя ьрърюср 'ceil_div'. #define ceil_div(x, y) (((x) + (y) - 1) / (y)) 4.8.3. Исяюыьчютрэшх тючъш с чряятющ Иэюуфр трхсухтся юярхфхыять ьрърюсы, шсяюыьчухьых т сюстртэых ъюэструъцшях. Ррссьютршь сыхфующшщ ьрърюс, ъютюрыщ шсяюыьчухт уърчртхыь (ррууьхэт 'p' уърчытрхт хую ьхстюяюыюцхэшх): #define SKIP_SPACES (p, limit) \ { register char *lim = (limit); \ while (p != lim) { \ if (*p++ != ' ') { \ p--; break; }}} Зфхсь яюсыхфютртхыьэюсть backslash-newline шсяюыьчухтся фыя ррчсшхэшя ьрърююярхфхыхэшя эр эхсъюыьъю стрюъ, яюсъюыьъу юэю фюыцэю сыть эр юфэющ стрюъх. Вычют этюую ьрърюср ьюцхт тыуыяфхть тръ: 'SKIP_SPACES (p, lim)'. Грусю уютюря, ярш хую тычютх юэ чрьхэяхтся эр сюстртэую ъюэструъцшю, ъютюрря ятыяхтся яюыэюстью чръюэчхээющ ш эхт эхюсхюфшьюстш т шсяюыьчютрэшш тючъш с чряятющ фыя хх чртхршхэшя. Ню тычют этюую ьрърюср тыуыяфшт ъръ тычют фуэъцшш. Пюэтюьу уфюсэхх суфхт тычытрть этют ьрърюс сыхфующшь юсррчюь: 'SKIP_SPACES (p, lim);' Ню этю ьюцхт ярштхстш ъ эхъютюрыь труфэюстяь ярш шсяюыьчютрэшш хую яхрхф тыррцхэшхь 'else', тръ ъръ тючър с чряятющ ятыяхтся яустыь тыррцхэшхь. Ррссьютршь тръющ яршьхр: if (*p != 0) SKIP_SPACES (p, lim); else ... Исяюыьчютрэшх фтух тыррцхэшщ (сюстртэющ ъюэструъцшш ш яустюую тыррцхэшя) ьхцфу усыютшхь 'if' ш ъюэструъцшхщ 'else' сючфрхт эхярртшыьэыщ С ъюф. Оярхфхыхэшх ьрърюср 'SKIP_SPACES' ьюцхт сыть шчьхэхэю фыя устррэхэшя этюую эхфюстртър с шсяюыьчютрэшхь ъюэструъцшш 'do ... while'. #define SKIP_SPACES (p, limit) \ do { register char *lim = (limit); \ while (p != lim) { \ if (*p++ != ' ') { \ p--; break; }}} \ while (0) Тхяхрь ьрърюс 'SKIP_SPACES (p, lim);' чрьхэяхтся эр do {...} while (0); чтю ятыяхтся юфэшь тыррцхэшхь. 4.8.4. Уфтюхэшх яюсючэых эффхътют Вю ьэюушх С ярюуррььрх юярхфхыяхтся ьрърюс 'min' фыя тычшсыхэшя ьшэшьуьр: #define min(X, Y) ((X) - тьхстю 'Y'. Фуэъцшя 'foo' шсяюыьчухтся т этющ ъюэструъцшш тюыьъю юфшэ ррч, т тю трхья ъръ тыррцхэшх 'foo (z)' шсяюыьчухтся фтрцфы т ьрърюяюфстрэютъх. В рхчуыьтртх фуэъцшя 'foo' ьюцхт сыть тычтрэр фтрцфы ярш тыяюыэхэшш тыррцхэшя. Есыш т ьрърюсх шьхются яюсючэых эффхъты шыш фыя тычшсыхэшя чэрчхэшщ ррууьхэтют трхсухтся ьэюую трхьхэш, рхчуыьтрт ьюцхт сыть эхюцшфрээыь. В фрээюь сыучрх ьрърюс 'min' ятыяхтся эхэрфхцэыь. Нршыучшшь рхшхэшхь этющ ярюсыхьы ятыяхтся юярхфхыхэшх ьрърюср 'min' тръшь юсррчюь, чтю чэрчхэшх 'foo (z)' суфхт тычшсыяться тюыьъю юфшэ ррч. В ячыъх С эхт стрэфрртэых срхфстт фыя тыяюыэхэшя яюфюсэых чрфрч, эю с шсяюыьчютрэшхь ррсшшрхэшщ GNU C этю ьюцхт сыть тыяюыэхэю сыхфующшь юсррчюь: #define min(X, Y) \ ({ typeof (X) __x = (X), __y = (Y); \ (__x r (foo) чрьхэяхтся эр '"foo" lose(4)'. Вючэшърхт тюярюс: фыя чхую шсяюыьчухтся фтр ярюхюфр фыя ярюсьютрр ьрърюср ш яючхьу сы эх шсяюыьчютрть юфшэ фыя яютышхэшя съюрюстш ррсюты ярхярюцхссюрр. В фхщсттштхыьэюстш, чфхсь хсть эхъютюрря ррчэшцр ш юэр ьюцхт сыть тшфэр т трхх ютфхыьэых сыучрях: Прш юфэюрюфэых тычютрх ьрърюсют. Прш шсяюыьчютрэшш ьрърюсют, тычытрющшх фруушх ьрърюсы, ъютюрых шсяюыьчуют стршэушфшърцшю шыш юсъхфшэхэшх. Прш шсяюыьчютрэшш ьрърюсют, сюфхрцрщшх ютърытых чряятых. Мрърю тычюты эрчытрются "юфэюрюфэыьш", хсыш ррууьхэт этюую ьрърюср сюфхрцшт тычют этюую цх ьрърюср. Нряршьхр, 'f' этю ьрърюс, яршэшьрющшщ юфшэ ррууьхэт, р 'f (f (1))' ятыяхтся юфэюрюфэющ яррющ тычютют ьрърюср 'f'. Трхсухьря яюфстрэютър ярюшчтюфштся яутхь яюфстрэютъш чэрчхэшя 'f (1)' ш хую чрьхэы эр юярхфхыхэшх 'f'. Дюяюыэштхыьэыщ ярюхюф ярштюфшт ъ цхырхьюьу рхчуыьтрту. Бхч хую тыяюыэхэшя чэрчхэшх 'f (1)' суфхт чрьхэхэю ъръ ррууьхэт ш тю ттюрюь ярюхюфх юэю эх суфхт чрьхэхэю, тръ ъръ суфхт ятыяхтся рхъурсштэыь эыхьхэтюь. Тръшь юсррчюь, яршьхэхэшх ттюрюую ярюхюфр ярхфюттррщрхт эхцхыртхыьэыщ яюсючэыщ эффхът ярртшыр ю рхъурсштэых ьрърюсрх. Ню яршьхэхэшх ттюрюую ярюхюфр ярштюфшт ъ эхъютюрыь юсыюцэхэшяь т ютфхыьэых сыучрях ярш тычютрх юфэюрюфэых ьрърюсют. Ррссьютршь яршьхр: #define foo a,b #define bar(x) lose(x) #define lose(x) (1 + (x)) bar(foo) Трхсухтся ярхюсррчютрть чэрчхэшх 'bar(foo)' т '(1 + (foo))', ъютюрюх чртхь фюыцэю сыть ярхюсррчютрэю т '(1 + (a,b))'. Ню тьхстю этюую, 'bar (foo)' чрьхэяхтся эр 'lose(a,b)' чтю т рхчуыьтртх ярштюфшт ъ юшшсъх, тръ ъръ 'lose' яршэшьрхт тюыьъю юфшэ ррууьхэт. В фрээюь сыучрх этр ярюсыхьр рхшрхтся яутхь шсяюыьчютрэшя съюсюъ фыя ярхфюттррщхэшя эхюфэюрюфэюстш рршфьхтшчхсъшх юяхррцшщ: #define foo (a,b) #define bar(x) lose((x)) Прюсыхьр стрэютштся сыюцэхх, хсыш ррууьхэты ьрърюср эх ятыяются тыррцхэшяьш, эряршьхр, ъюуфр юэш ятыяются ъюэструъцшяьш. Тюуфр шсяюыьчютрэшх съюсюъ эхяршьхэшью, тръ ъръ этю ьюцхт ярштхстш ъ эхярртшыьэюьу С ъюфу: #define foo { int a, b; ... } В GNU C чряятых ьюцэю чрърыть с яюьющью '({...})', чтю ярхюсррчухт сюстртэую ъюэструъцшю т тыррцхэшх: #define foo ({ int a, b; ... }) Иыш ьюцэю яхрхяшсрть ьрърююярхфхыхэшх схч шсяюыьчютрэшя тръшх чряятых: #define foo { int a; int b; ... } Сущхсттухт тръцх хщх юфшэ сыучрщ, ъюуфр яршьхэяхтся ттюрющ ярюхюф. Еую ьюцэю шсяюыьчютрть фыя яюфстрэютъш ррууьхэтр с хую яюсыхфующхщ стршэушфшърцшхщ ярш шсяюыьчютрэшш фтухурютэхтых ьрърюсют. Дюсртшь ьрърюс 'xstr' ъ ррссьютрхээюьу тышх яршьхру: #define xstr(s) str(s) #define str(s) #s #define foo 4 xstr (foo) Зфхсь чэрчхэшх 'xstr' чрьхэяхтся эр '"4"', р эх эр '"foo"'. Пршчшэющ этюьу сыуцшт тю, чтю ррууьхэт ьрърюср 'xstr' чрьхэяхтся ярш яхртюь ярюхюфх (тръ ъръ юэ эх шсяюыьчухт стршэушфшърцшю шыш юсъхфшэхэшх ррууьхэтр). В рхчуыьтртх яхртюую ярюхюфр фюрьшрухтся ррууьхэт ьрърюср 'str'. Оэ шсяюыьчухт стющ ррууьхэт схч ярхфтррштхыьэюую ярюсьютрр, тръ ъръ чфхсь шсяюыьчухтся стршэушфшърцшя. 4.8.7. Зртшсшьых ьрърюсы "Зртшсшьыь" ьрърюсюь эрчытрхтся ьрърюс, тхыю ъютюрюую сюфхрцшт ссыыъу эр фруующ ьрърюс. Этю фютюыьэю чрстю шсяюыьчухтся. Нряршьхр, #define BUFSIZE 1020 #define TABLESIZE BUFSIZE Этю эх ятыяхтся юярхфхыхэшхь ьрърюср 'TABLESIZE' сю чэрчхэшхь '1020'. Дшрхътштр '#define' фыя ьрърюср 'TABLESIZE' шсяюыьчухт т тючэюстш тхыю уърчрээюую ьрърюср, т фрээюь сыучрх этю 'BUFSIZE'. Пюфстрэютър чэрчхэшя 'TABLESIZE' ярюшчтюфштся тюыьъю ярш шсяюыьчютрэшш этюую ьрърюср. Прш шчьхэхэшш чэрчхэшя 'BUFSIZE' т ъръюь-ышсю ьхстх ярюуррььы хх тыяюыэхэшх ьхэяхтся. Мрърюс 'TABLESIZE', юярхфхыхээыщ ъръ сыыю юяшсрэю тышх, тсхуфр чрьхэяхтся с шсяюыьчютрэшхь чэрчхэшя ьрърюср 'BUFSIZE': #define BUFSIZE 1020 #define TABLESIZE BUFSIZE #undef BUFSIZE #define BUFSIZE 37 Тхяхрь чэрчхэшх 'TABLESIZE' чрьхэяхтся (т фтх стрфшш) эр '37'. 4.9. Сшьтюыы newline т ьрърюррууьхэтрх Прш юсычэющ юсррсютъх ьрърюсют тсх сшьтюыы newline т ьрърюррууьхэтрх шсяюыьчуются ярш ьрърюяюфстрэютъх. Этю ючэрчрхт, чтю хсыш эхъютюрых ррууьхэты яюфстртыяются сюыхх юфэюую ррчр шыш тююсщх эх яюфстртыяются, тю сшьтюыы newline ьюуут фусышрютрться. Есыш яюфстрэютър сюстюшт шч эхсъюыьъшх ъюэструъцшщ, тю т рхчуыьтртх яюряфюъ стрюъ этшх ъюэструъцшщ суфхт эррушхэ. Этю ьюцхт ярштхстш ъ эхярртшыьэыь чэрчхэшяь эюьхрют стрюъ т сююсщхэшях юс юшшсърх шыш ярш ррсютх с ютырфчшъюь. Прш ррсютх GNU C ярхярюцхссюрр т рхцшьх ANSI C, шь ъюэтрюышрухтся ьэюуюърртэюх шсяюыьчютрэшх юфэюую ррууьхэтр. Прш яхртюь хую шсяюыьчютрэшш яюфстртыяются тсх сшьтюыы newline, р ярш яюсыхфующхь шсяюыьчютрэшш этш сшьтюыы шуэюршруются. Ню фрцх ярш ррсютх т тръюь рхцшьх ьюцхт тючэшъэуть юшшсючэря эуьхррцшя стрюъ хсыш ррууьхэты шсяюыьчуются эх т эрфыхцрщхь яюряфъх шыш тююсхустX¶Е щх эх шсяюыьчуются. Ррссьютршь яршьхр: #define ignore_second_arg(a,b,c) a; c ignore_second_arg (foo (), ignored (), syntax error); Сшэтръсшчхсъря юшшсър сю ссыыъющ эр чхттхртую стрюъу яюыучрхтся т рхчуыьтртх юсррсютъш стрюъш 'syntax error', хютя юшшсючэюх тыррцхэшх эрхюфштся т яятющ стрюъх. 5. Усыютшя В ррсютх ярхярюцхссюрр "усыютшхь" эрчытрхтся фшрхътштр, ярш тыяюыэхэшш ъютюрющ чрсть ярюуррььы шуэюршрухтся тю трхья ъюьяшыяцшш яюсых ярютхръш эхъютюрых усыютшщ. В С ярхярюцхссюрх т усыютшш ьюуут шсяюыьчютрться ъръ рршфьхтшчхсъшх тыррцхэшя, тръ ш шьхэр юярхфхыхээых ьрърюсют. Усыютшх т С ярхярюцхссюрх т эхъютюрых рсяхътрх шьххт схюфсттю с ъюэструъцшхщ 'if' ячыър С, эю трцэю яюэшьрть шх ютышчшя. Усыютшх т ъюэструъцшш 'if' ярютхряхтся ярш тыяюыэхэшш ярюуррььы. Ех цхыью сыуцшт шчьхэхэшх хюфр ярюуррььы т чртшсшьюстш ют юсррсртытрхьых фрээых. Усыютшх т ярхярюцхссюрх ярютхряхтся ярш ъюьяшыяцшш ярюуррььы. Оэю шсяюыьчухтся фыя тъыючхэшя т ярюуррььу ррчышчэых чрстхщ ъюфр т чртшсшьюстш ют усыютшщ, устрэютыхээых ярш хх ъюьяшыяцшш. 5.1. Дыя чхую шсяюыьчуются усыютшя Сущхсттухт трш юсэютэых яршчшэы фыя яршьхэхэшя усыютшщ. Дыя тыяюыэхэшя ярюуррььы эр ррчышчэых яыртфюрьрх ьюцхт яютрхсютрться ррчэыщ шсхюфэыщ ъюф. В эхъютюрых сыучрях, ярюуррььр, эряшсрээря фыя юфэющ юяхррцшюээющ сшстхьы, суфхт эхъюррхътэю ррсютрть т фруующ юяхррцшюээющ сшстхьх. В яюфюсэых сштурцшях эхфюстртючэю уъыюэхэшя ют тыяюыэхэшя эхэуцэых ярюцхфур. Есыш ярюуррььр шх сюфхрцшт, тю чрстю сыучрхтся, чтю эхтючьюцэю съюьяюэютрть ш чряустшть ярюуррььу. Прш шсяюыьчютрэшш усыютэющ ъюьяшыяцшш, эхшсяюыьчухьыщ ъюф ьюцхт сыть шсъыючхэ шч ярюуррььы. Иэюуфр трхсухтся съюьяшышрютрть юфшэ шсхюфэыщ фрщы т фтх ррчэых ярюуррььы. Сыучрхтся, чтю ррчышчшя т ярюуррььрх чръыючрются т тюь, чтю юфэр шч эшх тыяюыэяхт яюстюяээую, чрэшьрющую ьэюую трхьхэш, юсррсютъу фрээых шыш тыфрхт чэрчхэшя этшх фрээых фыя ютырфъш, т тю трхья ъръ фрууря эх фхырхт этюую. Пршьхэхэшх усыютшщ, уфх ярютхрър тыфрхт чртхфюью ыюцэыщ рхчуыьтрт, шсяюыьчухтся фыя шсъыючхэшя ъюфр шч ярюуррььы, ъютюрыщ ьюцхт ятыяться юфэшь шч тшфют ъюььхэтрршхт фыя ссыыъш эр эхую т суфующхь. В сюыьшшэсттх ярюстых ярюуррьь, ярхфэрчэрчхээых фыя тыяюыэхэшя тюыьъю эр юфэюь ъюьяьютхрх, усыютшя юсычэю эх шсяюыьчуются. 5.2. Сшэтръсшс усыютшщ Усыютшх т С ярхярюцхссюрх эрчшэрхтся с фшрхътшты усыютшя: '#if', '#ifdef' шыш '#ifndef'. Дрыхх ррссьртрштрхтся тюыьъю фшрхътштр '#if'. 5.2.1. Дшрхътштр '#if' Прюстхщшря фюрьр шсяюыьчютрэшя фшрхътшты '#if' ррссьютрхэр эшцх. #if EXPRESSION CONTROLLED TEXT #endif /* EXPRESSION */ Кюььхэтрршщ, сыхфующшщ чр фшрхътштющ '#endif' эх ятыяхтся юсячртхыьэыь, эю яюьюурхт ярш эряшсрэшш ш чтхэшш ярюуррььы. Тръшх ъюььхэтрршш тсхуфр сыхфухт шсяюыьчютрть, чр шсъыючхэшхь эхсюыьшшх ъюэструъцшщ. В фхщсттштхыьэюстш, тхъст т стрюъх яюсых фшрхътшты '#endif' шуэюршрухтся GNU C ярхярюцхссюрюь, эю стрэфррт ANSI C трхсухт яршьхэхэшя ъюььхэтрршхт. Выррцхэшх EXPRESSION ятыяхтся С тыррцхэшхь тшяр integer, чтю ярхфстртыяхт сюсющ сшыьэюх юуррэшчхэшх. Оэю ьюцхт сюфхрцрть: Цхыых ъюэстрэты, ъютюрых ррссьртрштрются ъръ тшя 'long' шыш 'unsigned long'. Сшьтюыьэых ъюэстрэты, ъютюрых шэтхрярхтшруются т сююттхтсттшш с эрсюрюь сшьтюыют ш т чртшсшьюстш ют ъюьяьютхрр ш юяхррцшюээющ сшстхьы, эр ъютюрющ устрэютыхэ ярхярюцхссюр. Дыя тръшх ъюэстрэт GNU С ярхярюцхссюр шсяюыьчухт тшя фрээых 'char'. Пюэтюьу ятыяются ыш ъюфы эхъютюрых сшьтюыют ютршцртхыьэыьш чэрчхэшяьш, юярхфхыяхтся С ъюьяшыятюрюь, ъютюрыщ шсяюыьчютрыся фыя ъюьяшыяцшш ярхярюцхссюрр. Есыш тшя 'char' ятыяхтся чэръютыь, тю сшьтюыы, чэрчхэшя ъютюрых фюстртючэю тхышъш фыя устрэютъш чэръютюую сштр, ррссьртрштрются ъръ ютршцртхыьэых чэрчхэшя. В ярютштэюь сыучрх тшя 'char' ятыяхтся тсхуфр яюыюцштхыьэыь чэрчхэшхь. Аршфьхтшчхсъшх юяхррцшш сыюцхэшя, тычштрэшя, уьэюцхэшя, фхыхэшя, юяхррцшш с сштрьш, сфтшуш, срртэхэшя, р тръцх ыюушчхсъшх юяхррцшш ('&&' ш '||'). Ифхэтшфшъртюры, эх ятыяющшхся ьрърюсрьш ш ррссьртрштрхьых ъръ эуыхтюх чэрчхэшх. Мрърю тычюты. Пхрхф тычшсыхэшхь чэрчхэшя тыррцхэшя сэрчрыр ярюшчтюфштся ьрърюяюфстрэютър. Сыфухт чрьхтшть, чтю эх фюяусърхтся шсяюыьчютрть юяхрртюры 'sizeof' ш чэрчхэшя тшяр 'enum'. Всх чэрчхэшя тшяр 'enum', тръцх ъръ ш тсх шфхэтшфшъртюры, эх ятыяющшхся ьрърю тычютрьш, ррссьртрштрются ъръ эуыхтюх чэрчхэшх. Тхъст, эрхюфящшщся тэутрш усыютэющ ъюэструъцшш, ьюцхт тъыючрть фшрхътшты ярхярюцхссюрр, ъютюрых юсррсртытрются ярш тыяюыэхэшш трхсухьых усыютшщ. Тхъст ьюцхт тръцх сюфхрцрть ш фруушх усыютэых ъюэструъцшш. Офэръю фшрхътшты '#if' ш '#endif' фюыцэы юсррчютытрть хфшэую ъюэструъцшю. 5.2.2. Дшрхътштр '#else' Дшрхътштр '#else' ьюцхт шсяюыьчютрться т усыютэющ ъюэструъцшш фыя ярхфюстртыхэшя рыьтхрэртштэюую ъюфр ярюуррььы ттюь сыхустX¶Е учрх, хсыш усыютшх ыюцэю. Вют ъръ этю тыуыяфшт: #if EXPRESSION TEXT-IF-TRUE #else /* Not EXPRESSION */ TEXT-IF-FALSE #endif /* Not EXPRESSION */ Есыш чэрчхэшх EXPRESSION ятыяхтся эхэуыхтыь ш шсяюыьчухтся ъюф TEXT-IF-TRUE, тю фшрхътштр '#else' ррссьртрштрхтся ъръ ыюцэюх усыютшх ш ъюф TEXT-IF-FALSE шуэюршрухтся. И эрюсюрют, хсыш усыютшх '#if' - ыюцэю, тю тъыючрхтся ъюф TEXT-IF-FALSE. 5.2.3. Дшрхътштр '#elif' Осычэюх яршьхэхэшх юфэюрюфэых усыютшщ стячрэю с ярютхръющ сюыхх чхь фтух тючьюцэых трршрэтют. Нряршьхр: #if X == 1 ... #else /* X != 1 */ #if X == 2 ... #else /* X != 2 */ ... #endif /* X != 2 */ #endif /* X != 1 */ Дюяюыэштхыьэря фшрхътштр '#elif' яючтюыяхт этю сюърртшть ъръ ррссьютрхэю эшцх. #if X == 1 ... #elif X == 2 ... #else /* X != 2 and X != 1*/ ... #endif /* X != 2 and X != 1*/ Дшрхътштр '#elif' ючэрчрхт "шэрчх хсыш" ("else if"). Тръцх ъръ ш '#else', юэр яюьхщрхтся т схрхфшэу ъюэструъцшш '#if'-'#endif' ш яюфррчфхыяхт хх. Ещ эх трхсухтся эрышчшя сюссттхээющ фшрхътшты '#endif'. Тръцх ъръ ш '#if', фшрхътштр '#elif' тъыючрхт т схся тхстшрухьюх тыррцхэшх. Тхъст, сыхфующшщ чр фшрхътштющ '#elif' тъыючрхтся тюыьъю т тюь сыучрх, ъюуфр чэрчхэшх шчхюфящхщ фшрхътшты '#if' - ыюцэю, р усыютшх '#elif' - тхрэю. В юфэющ ъюэструъцшш '#if'-'#endif' ьюцхт шсяюыьчютрться сюыхх чхь юфэр фшрхътштр '#elif'. Тхъст яюсых фшрхътшты '#elif' тъыючрхтся тюыьъю т тюь сыучрх, ъюуфр усыютшх '#elif' - тхрэю ш эрхюфштся яюсых усыютшя '#if' шыш ярхфшхсттующхую '#elif', чэрчхэшя ъютюрых - ыюць. '#else' ятыяхтся эътштрыхэтюь фшрхътшты '#elif 1', р '#else' ьюцхт сыхфютрть яюсых ыюсюую ъюышчхсттр фшрхътшт '#elif', т тю трхья ъръ '#elif' эх ьюцхт сыхфютрть чр '#else'. 5.3. Сюхррэхэшх уфрыхээюую ъюфр фыя фрыьэхщшшх ссыыюъ Есыш чрсть ярюуррььы сыыр яхрхьхщхэр шыш уфрыхэр, эю хсть эхюсхюфшьюсть т сюхррэхэшш стррюую ъюфр т ърчхсттх ъюььхэтрршя фыя фрыьэхщшшх ссыыюъ ъ эхьу, тю ярюстхщшшщ сяюсюс рхрышчрцшш этюую чръыючрхтся т шсяюыьчютрэшш ъюэструъцшш '#if 0'-'#endif', тэутрш ъютюрющ эрхюфштся этют ъюф. Этю ррцшюэрыьэхх яршьхэхэшя юсычэых ъюььхэтрршхт, тръ ъръ этю эх тсхуфр яюьюурхт, хсыш этют ъюф тръцх сюфхрцшт ъюььхэтрршш. Тръря ъюэструъцшя т ыюсюь сыучрх суфхт схчюшшсючэющ, фрцх хсыш чръыючхээыщ т эхх тхъст тръцх сюфхрцшт усыютшя (яюыэых ъюэструъцшш '#if'- '#endif'). Офэръю эх сыхфухт яршьхэять тръую ъюэструъцшю, хсыш ъюььхэтшрухьыщ тхъст эх ятыяхтся С ъюфюь. Дыя этюую шсяюыьчуются юсычэых С ъюььхэтрршш. Дшрхътштр '#if 0' фюыцэр сюстюять шч ярртшыьэых ыхъсхь. 5.4. Усыютшя ш ьрърюсы Усыютшя чрстю шсяюыьчуются тьхстх с ьрърюсрьш шыш уттхрцфхэшяьш, тръ ъръ юэш ятыяются хфшэсттхээыьш тыррцхэшяьш, чьш чэрчхэшя ьюуут тррьшрютрться ярш ъюьяшыяцшш. Дшрхътштр '#if', эх шсяюыьчующря ьрърюсы шыш уттхрцфхэшя, ятыяхтся эътштрыхэтюь фшрхътштх '#if 1' шыш '#if 0'. Нряршьхр, ррссьютршь усыютшх, ярютхряющхх тыррцхэшх 'BUFSIZE == 1020', уфх 'BUFSIZE' ятыяхтся ьрърюсюь. #if BUFSIZE == 1020 printf ("Large buffers!\n"); #endif /* BUFSIZE is large */ Прш ярюуррььшрютрэшш чрстю трхсухтся юярхфхышть ррчьхр яхрхьхээющ шыш тшя фрээых т фшрхътштх '#if', эю ярхярюцхссюр эх юсррсртытрт тръшх юяхрртюры ъръ 'sizeof' шыш ъыючхтых сыютр ъръ 'int'. В фшрхътштх '#if' яршьхэяхтся сяхцшрыьэыщ юяхрртюр 'defined', шсяюыьчухьыщ фыя ярютхръш сююттхтсттшя уърчрээюую шьхэш сущхсттующхьу ьрърюсу. В ыюсюь сыучрх, чэрчхэшхь тыррцхэшя 'defined NAME' шыш 'defined (NAME)' ятыяхтся 1, хсыш т фрээюь ьхстх ярюуррььы юярхфхыхэ ьрърюс с шьхэхь NAME, т ярютштэюь сыучрх чэрчхэшхь тыррцхэшя суфхт 0. Дыя юяхрртюрр 'defined' шьххт чэрчхэшх эх юярхфхыхэшх ьрърюср, р тю чтю юэю хсть. Ррссьютршь яршьхр: #if defined (vax) || defined (ns16000) Зфхсь чэрчхэшхь тыррцхэшя суфхт шстшэр, хсыш ъръ шья 'vax', тръ ш 'ns16000' юярхфхыхэы ъръ ьрърюсы. Тю цх срьюх ьюцэю тыяюыэшть с яюьющью уттхрцфхэшщ: #if #cpu (vax) || #cpu (ns16000) Есыш ьрърюс сыы юярхфхыхэ, р чртхь уэшчтюцхэ с яюьющью фшрхътшты '#undef', тю яюсыхфующхх яршьхэхэшх юяхрртюрр 'defined' тючтрртшт чэрчхэшх 0, тръ ъръ этю шья сюыьшх эх юярхфхыхэю. Есыш цх ьрърюс чрэютю юярхфхыхэ фшрхътштющ '#define', тю юяхрртюр 'defined' тючтрртшт чэрчхэшх 1. Усыютшя, ярютхряющшх юярхфхыхэшх юфэюую шьхэш фютюыьэю чрстю шсяюыьчуются, яюэтюьу фыя этющ цхыш сущхсттухт фтх фюяюыэштхыьэых усыютэых фшрхътшты. '#ifdef NAME' чтю ятыяхтся эътштрыхэтюь '#if defined (NAME)'. '#ifndef NAME' чтю ятыяхтся эътштрыхэтюь '#if ! defined (NAME)'. Мрърююярхфхыхэшя ьюуут ьхэяться ярш ррчэых ярюцхссрх ъюьяшыяцшш яю эхъютюрыь яршчшэрь. Нхъютюрых ьрърюсы ятыяются чрррэхх юярхфхыхээыьш, т чртшсшьюстш ют тшяр шсяюыьчухьюую ъюьяьютхрр. Нряршьхр, эр ъюьяьютхррх Vax, шья 'vax' ятыяхтся чрррэхххустX¶Е юярхфхыхээыь ьрърюсюь. Нр фруушх ъюьяьютхррх юэю эх юярхфхыхэю. Бюыьшюх ъюышчхсттю ьрърюсют юярхфхыяхтся сшстхьэыьш яюфъыючрхьыьш фрщырьш. Нр ррчышчэых сшстхьрх ш ъюьяьютхррх юярхфхыяются ррчэых ьрърюсы с ррчэыьш чэрчхэшяьш. Очхэь чрстю яюыхчэю ярютхрять этш ьрърюсы усыютэыьш ъюэструъцшяьш тю шчсхцрэшх шсяюыьчютрэшя ряяррртэых тючьюцэюстхщ эр ъюьяьютхрх, уфх юэш эх рхрышчютрэы. Мрърюсы ятыяются ярюстыь сяюсюсюь эрстрющъш яюыьчютртхыяьш ярюуррььы фыя ррчышчэых сшстхь шыш яршыюцхэшщ. Нряршьхр, ьрърюс 'BUFSIZE' ьюцхт сыть юярхфхыхэ т ъюэфшууррцшюээюь фрщых ярюуррььы, ъютюрыщ тъючрхтся т ърчхсттх яюфъыючрхьюую фрщыр т ърцфыщ шсхюфэыщ фрщы. Мюцэю шсяюыьчютрть ьрърюс 'BUFSIZE' т усыютшш ярхярюцхссюрр фыя ухэхррцшш ъюфр, чртшсящхую ют тысррээющ ъюэфшууррцшш. Мрърюсы ьюуут юярхфхыяться шыш уэшчтюцрться с яюьющью юяцшщ ярхярюцхссюрр '-D' ш '-U' ярш ъюьяшыяцшш ярюуррььы. Мюцэю сфхырть тръ, чтю юфшэ ш тют цх шсхюфэыщ фрщы суфхт съюьяшышрютрэ т фтх ррчышчэых ярюуррььы яутхь юярхфхыхэшя эуцэюую ьрърюср, шсяюыьчютрэшя усыютшщ фыя ярютхръш чэрчхэшя этюую ьрърюср ш яхрхфрчш чэрчхэшя ьрърюср чхрхч юяцшш ъюьяшыятюрр. Уттхрцфхэшя юсычэю ятыяются чрррэхх юярхфхыхээыьш, эю юэш тръцх ьюуут сыть юярхфхыхэы с яюьющью фшрхътшт шыш юяцшщ ярхярюцхссюрр. 5.5. Уттхрцфхэшя "Уттхрцфхэшя" ятыяются сюыхх сшстхьртшчхсъющ рыьтхрэртштющ ьрърюсрь ярш сючфрэшш усыютшщ эр ярютхръу тшяр ъюьяьютхрр шыш сшстхьы, шсяюыьчухьющ ярш ъюьяшыяцшш ярюуррььы. Уттхрцфхэшя юсычэю юярхфхыхэы чрррэхх, хютя юэш ьюуут сыть тръцх юярхфхыхэы фшрхътштрьш ярхярюцхссюрр шыш с яюьющью юяцшщ. Осычэю ьрърюсы эх ъырссшфшцшруются ъръшь-ышсю юсррчюь яю шх юярхфхыхэшю. Оэш ьюуут уърчытрть эр ррхштхътуру ьюфхыш ъюьяьютхрр, ютфхыьэую ьюфхыь ъюьяьютхрр, эр юяхррцшюээую сшстхьу, хх тхрсшю шыш эр сяхцшфшчхсъшх тючьюцэюстш ъюэфшууррцшш. Всх этю ьюцхт сючхтрться т юфэюь ьрърюсх. В ютышчшх ют ьрърюсют, уттхрцфхэшя сюстюят шч чхтъю яюстртыхээюую тюярюср ш юттхтр эр эхую. Вюярюс юсычэю эрчытрхтся "уттхрцфхэшхь". Уттхрцфхэшх тыуыяфшт сыхфующшь юсррчюь: #PREDICATE (ANSWER) Дыя шьхэш PREDICATE сыхфухт шсяюыьчютрть ярртшыьэю сфюрьшрютрээыщ шфхэтшфшъртюр. Зэрчхэшхь ANSWER ьюцхт сыть ыюсря яюсыхфютртыьэюсть сыют. Зфхсь тсх сшьтюыы ятыяются чэрчшьыьш, чр шсъыючхэшхь ярюсхыют, ррсяюыюцхээых т эрчрых ш т ъюэцх ANSWER. Ррчышчшя т ярюсхырх т схрхфшэх чэрчхэшя шуэюршруются. Нх ррчрхшрхтся шсяюыьчютрть сшьтюы ')' т чэрчхэшш ANSWER. Дрыхх ярштхфхэ яршьхр усыютшя, ярютхряющхую ятыяхтся ыш юттхт ANSWER уттхрцфхэшхь PREDICATE: #if #PREDICATE (ANSWER) Дыя юфэюую уттхрцфхэшя ьюцхт сущхсттютрть эхсъюыьъю юттхтют. Есыш юттхт уяущхэ ярш юярхфхыхэшш уттхрцфхэшя, тю сыхфухт ярютхрять, сущхсттухт ыш у фрээюую уттхрцфхэшя ъръющ-эшсуфь юттхт: #if #PREDICATE Бюыьшшэсттю ярютхряхьых уттхрцфхэшщ ятыяются чрррэхх юярхфхыхээыьш. GNU C ярхфюстртыяхт трш чрррэхх юярхфхыхээых уттхрцфхэшя: 'system', 'cpu' ш 'machine'. Уттхрцфхэшх 'system' шсяюыьчухтся фыя юяшсрэшя тшяр юяхррцшюээющ сшстхьы, 'cpu' - фыя юяшсрэшя ррхштхътуры ъюьяьютхрр, р 'machine' ярхфюстртыяхт фюяюыэштхыьэую шэфюрьрцшю ю ъюьяьютхрх. Нряршьхр, т сшстхьх GNU суфут тхрэы сыхфующшх уттхрцфхэшя: #system (gnu) #system (mach) #system (mach 3) #system (mach 3.SUBVERSION) #system (hurd) #system (hurd VERSION) р тръцх тючьюцэю ш фруушх. Аыьтхрэртштэых уттхрцфхэшя с сюыхх шыш ьхэхх яюфрюсэющ шэфюрьрцшхщ ю тхрсшш сшстхьы яюьюуут яюыучшть юттхт эр тюярюс ю тшях юяхррцшюээющ сшстхьы. В сшстхьх Unix сущхсттухт уттхрцфхэшх '#system (unix)', р тючьюцэю юфэю шч сыхфующшх: `#system (aix)', `#system (bsd)', `#system (hpux)', `#system (lynx)', `#system (mach)', `#system (posix)', `#system (svr3)', `#system (svr4)', шыш `#system (xpg4)' тхрюятэю с яюсыхфующхщ шэфюрьрцшхщ ю тхрсшш сшстхьы. Друушх чэрчхэшя фыя 'system' этю '#system (mvs)' ш '#system (vms)'. Мэюушх Unix С ъюьяшыятюры ярхфюстртыяют тюыьъю юфшэ юттхт эр уттхрцфхэшх 'system': '#system (unix)', хсыш юэш тююсщх шсяюыьчуют уттхрцфхэшя. Уттхрцфхэшх, юттхт ъютюрюую сюсютюшт шч эхсъюыьъшх сыют сшыьэю ютышчрхтся ют уттхрцфхэшщ с юттхтюь шч юфэюую сыютр. Нряршьхр, уттхрцфхэшх 'system (mach 3.0)' эх ючэрчрхт, чтю 'system (3.0)' - тхрэю. Этю тръцх эх тсхуфр ючэрчрхт, чтю 'system (mach)' тюцх тхрэю, эю т GNU C яюсыхфэхх уттхрцфхэшх ьюцхт сыть шсяюыьчютрэю. В эрстюящшщ ьюьхэт тючьюцэых чэрчхэшя уттхрцфхэшщ фыя 'cpu' ятыяются '#cpu (a29k)', `#cpu (alpha)', `#cpu (arm)', `#cpu (clipper)', `#cpu (convex)', `#cpu (elxsi)', `#cpu (tron)', `#cpu (h8300)', `#cpu (i370)', `#cpu (i386)', `#cpu (i860)', `#cpu (i960)', `#cpu (m68k)', `#cpu (m88k)', `#cpu (mips)', `#cpu (ns32k)', `#cpu (hppa)', `#cpu (pyr)', `#cpu (ibm032)', `#cpu (rs6000)', `#cpu (sh)', `#cpu (sparc)', `#cpu (spur)', `#cpu (tahoe)', `#cpu (vax)', `#cpu (we32000)'. В С ярюуррььх ьюцэю сючфртрть стюш уттхрцфхэшя с яюхустX¶Е ьющью фшрхътшты '#assert' сыхфующшь юсррчюь: #assert PREDICATE (ANSWER) (сыхфухт чрьхтшть ютсутсттшх сшьюыр '#' яхрхф PREDICATE.) Прш ърцфюь тыяюыэхэшш этющ фшрхътшты сючфрхтся эютыщ ярртшыьэыщ юттхт фыя PREDICATE. Прш уттхрцфхэшш юфэюую юттхтр ярхфыфущшх чэрчхэшя юстрются т сшых. Ефшэсттхээыщ сяюсюс уфрышть уттхрцфхэшх - шсяюыьчютрть фшрхътшту '#unassert'. Этр фшрхътштр шьххт тръющ цх сшстръсшс ъръ ш '#assert'. Мюцэю уфрышть тсх уттхрцфхэшя фыя PREDICATE сыхфующшь юсррчюь: #unassert PREDICATE Тръцх шьххтся тючьюцэюсть фюсртыхэшя шыш уфрыхэшя уттхрцфхэшщ с яюьющью юяцшщ ярш тычютх 'gcc' шыш 'cpp'. 5.6. Дшрхътшты '#error' ш '#warning' Дшрхътштр '#error' тыэуцфрхт ярхярюцхссюр сфхырть ютчхт ю фртрыьэющ юшшсъх. Всх чтю сыхфухт яюсых '#error' шсяюыьчухтся фыя сююсщхэшя. Дшрхътштр '#error' т тхых усыютшя, ярютхряющхую ъюьсшэрцшю ярррьхтрют, эх фю ъюэцр яюффхрцштрхьых ярюуррььющ, шсяюыьчухтся фыя сююсщхэшя ю тючьюцэющ юшшсъх. Нряршьхр, хсыш шчтхстэю, чтю ярюуррььр эх сютсхь ъюррхътэю тыяюыэяхтся эр сшстхьх Vax, тю ьюцэю эряшсрть: #ifdef __vax__ #error Won't work on Vaxen. See comments at get_last_object. #endif Есыш шьххтся эхсъюыьъю ъюэфшууррцшюээых ярррьхтрют, ъютюрых фюыцэы сыть уърчрэы сююттхтсттующшь юсррчюь ярш устрэютъх, ьюцэю шсяюыьчютрть усыютшя фыя юярхфхыхэшя эхсююттхтсттшя ш тыфрть сююсщхэшх юс юшшсъх. Нряршьхр, #if HASH_TABLE_SIZE % 2 == 0 || HASH_TABLE_SIZE % 3 == 0 \ || HASH_TABLE_SIZE % 5 == 0 #error HASH_TABLE_SIZE should not be divisible by a small prime #endif Дшрхътштр '#warning' рэрыюушчэр фшрхътштх '#error', эю ярштюфшт ъ тюьу, чтю ярхярюцхссюр тыфрхт ярхфуярхцфрющхх сююсщхэшх ш ярюфюыцрхт юсррсютъу. Всх чтю, чтю сыхфухт яюсых '#warning' шсяюыьчухтся фыя сююсщхэшя. Эту фшрхътшту ьюцэю шсяюыьчютрть т устррхтшшх яюфъыючрхьых фрщырх с уърчрэшхь эр эютую тхрсшю фрщыр. 6. Кюьсшэшрютрэшх шсхюфэых фрщыют Офэр шч юсэютэых чрфрч С ярхярюцхссюрр - этю яхрхфрчр шэфюрьрцшш ъюьяшыятюру ю ьхстюррсяюыюцхэшш ррчышчэых чрстхщ ярюуррььы. Кюф ярюуррььы ьюцхт фюрьшрютрться шч эхсъюыьъшх шсхюфэых фрщыют ярш шсяюыьчютрэшш фшрхътшты '#include'. Пршьхэхэшх ъръ фшрхътшты '#include', тръ ш усыютшщ с ьрърюсрьш ярштюфшт ъ шчьхэхэшю юсэютэюую шсхюфэюую фрщыр. Сыхфухт яршэшьрть тю тэшьрэшх чэрчхэшх эуьхррцшш стрюъ С ъюьяшыятюрюь (ярш сююсщхэшях юс юшшсърх) ш ютырфчшъюь (эряршьхр, GDB). В С ярхярюцхссюрх сущхсттухт фшрхътштр, яючтюыяющря ъюэтрюышрютрть эту тючьюцэюсть. Этю ьюцхт яршуюфшться т сыучрх, хсыш фрщыюь ттюфр ярхярюцхссюрр ятыяхтся фрщы тытюфр фруующ ярюуррььы, тръющ ъръ 'bison', ъютюрря юсррсртытрхт фруующ фрщы, ятыяющшщся юсэютэыь шсхюфэыь фрщыюь. Прш яюфюсэющ юсррсютъх эуьхррцшя стрюъ тхряхтся. Дыя устррэхэшя этюую эхфюстртър шсяюыьчухтся фшрхътштр '#line', ъютюрря яючтюыяхт уърчрть эюьхр стрюъш рхрыьэюую шсхюфэюую фрщыр тьхстх с хую шьхэхь. Дшрхътштр '#line' яршьхэяхтся т трхх ьюфшфшърцшях: '#line LINENUM' Зфхсь LINENUM этю фхсятшчэря цхыря ъюэстрэтр, уърчытрющря, чтю сыхфующря стрюър ятыяхтся стрюъющ шсхюфэюую фрщыр с эюьхрюь LINENUM. '#line LINENUM FILENAME' Зфхсь LINENUM этю фхсятшчэря цхыря ъюэстрэтр, р FILENAME - стрюъютря ъюэстрэтр, уърчытрющря, чтю сыхфующря стрюър ятыяхтся стрюъющ шсхюфэюую фрщыр с шьхэхь FILENAME, р хх эюьхр - LINENUM. Зэрчхэшх FILENAME фюыцэю сыть чръыючхэю т фтющэых ъртычъш. '#line ANYTHING ELSE' Зэрчхэшх ANYTHING ELSE ярютхряхтся эр эрышчшх ьрърю тычютют, ъютюрых чртхь яюфстртыяются. Рхчуыьтртюь фюыцэр сыть фхсятшчэря цхыря ъюэстрэтр, чр ъютюрющ ьюцхт сыхфютрть стюрюъютря ъюэстрэтр, ъръ этю ррссьютрхэю тышх. Дшрхътштр '#line' шчьхэяхт чэрчхэшя чрррэхх юярхфхыхээых ьрърюсют '__FILE__' ш '__LINE__'. Вытюф ярхярюцхссюрр (ъютюрыщ чртхь яхрхэряртыяхтся т ъюьяшыятюр) сюфхрцшт фшрхътшты, яюфюсэых '#line', тюыьъю юэш эрчшэрются с сшьтюыр '#', т ютышчшх ют '#line', чр ъютюрыьш сыхфухт эюьхр стрюъш ш шья фрщыр. 7. Друушх фшрхътшты ярхярюцхссюрр В этюь ррчфхых ррссьртрштрются трш фюяюыэштхыьэых фшрхътшты. Оэш юяшсытрются фыя яюыэюты ш эх ятыяются чрстю шсяюыьчухьыьш. "Пустря фшрхътштр" сюстюшт шч сшьтюыр '#', чр ъютюрыь сыхфухт сшьтюы эютющ стрюъш, яршчхь ьхцфу эшьш ьюуут сыть тюыьъю ярюсхыы (тъыючря ъюььхэтрршш). Пустря фшрхътштр ррссьртрштрхтся ъръ фшрхътштр ярхярюцхссюрр ш эх тышяхт эр юсщшщ тытюф. Осэютэыь чэрчхэшхь этющ фшрхътшты ятыяхтся тю, ярш юсррсютъх стрюъш, сюфхрцрщхщ сшьтюы '#', эр тытюф эшчхую эх яхрхфрхтся, т ютышчшх ют тытюфшьющ стрюъш, сюфхрцрщхщ '#'. Стрэфррт ANSI уърчытрхт, чтю фшрхътштр '#pragma' шьххт ярюшчтюыьэюх чэрчхэшх, устрэртыштрхьюх ярш ррчррсютъх. В ярхярюцхссюрх GNU C юэр эх шсяюыьчухтся, чр шсъыючхэшхь чэрчхэшя '#pragma once'. Офэръю, юэр юстрхтся ярш тытюфх ярхярюцхссюрр ш ьюцхт сыть шсяюыьчютрэр т ярюцхссх ъюьяшыяцшш. Дшрхътштр '#ident' шсяюыьчухтся фыяхустX¶Е сютьхстшьюстш с эхъютюрыьш сшстхьрьш. Зр эхщ сыхфухт стрюър с тхъстюь. Нр эхъютюрых сшстхьрх этют тхъст ъюяшрухтся т ютфхыьэюх ьхстю юсъхътэюую фрщыр. Ню т сюыьшшэсттх сшстхь юэ ярюстю шуэюршрухтся ш яршьхэхэшх этющ фшрхътшты эх фрхт эшъръюую эффхътр. В фхщсттштхыьэюстш, этр фшрхътштр ятыяхтся хфшэсттхээющ фшрхътштющ, шсяюыьчухьющ т яюфъыючрхьых фрщырх ш фуэъцшюэшрухт эр тхх сшстхьрх, ъютюрых хх яюффхрцштрют. 8. Вытюф С ярхярюцхссюрр Вытюф С ярхярюцхссюрр тыуыяфшт яршьхрэю тръ цх, ъръ ш ттюф, тюыьъю тсх стрюъш с фшрхътштрьш чрьхэяются эр яустых ш ъюььхэтрршш чрьхэяются ярюсхырьш. Прюсхыы т схрхфшэх стрюъш эх ьхэяются. Офэръю ярюсхы тстртыяхтся яюсых сюыьшшэсттр ьрърюяюфстрэютюъ. Иья шсхюфэюую фрщыр ш шэфюрьрцшя ю эюьхрх стрюъш яхрхфрхтся т стрюърх сыхфующхщ фюрьы: # LINENUM FILENAME FLAGS ъютюрых тстртыяются т схрхфшэу ттюфшьюую фрщыр (эю эх т стрючэую шыш сшьтюыьэую ъюэстрэту). Пюятыхэшх тръющ стрюъш ючэрчрхт, чтю сыхфующря стрюър сюфхрцштся т фрщых FILENAME ш шьххт яюряфъютыщ эюьхр LINENUM. Пюсых шьхэш фрщыр сыхфухт эуыь шыш сюыхх фыруют, чэрчхэшя ъютюрых ьюуут сыть '1', '2', '3' шыш '4'. Есыш фыруют сюыхх юфэюую, тю юэш ррчфхыяются ярюсхырьш. Дрыхх сыхфухт юяшсрэшх этшх фыруют. '1' Уърчытрхт эр эрчрыю эютюую фрщыр. '2' Уърчытрхт эр тючтррт т фрщы (яюсых тъыючхэшя фрууюую фрщыр). '3' Уърчытрхт эр тю, чтю сыхфующшщ тхъст шсхюфшт шч сшстхьэюую яюфъыючрхьюую фрщыр, яюэтюьу фюыцэы шсяюыьчютрться сяхцшрыьэых ярхфуярхцфрющшх сююсщхэшя. '4' Уърчытрхт эр тю, чтю сыхфующшщ тхъст фюыцхэ ррссьртрштрться ъръ С ъюф. 9. Вычют GNU С Прхярюцхссюрр Осычэю эхт эхюсхюфшьюстш тычытрть С ярхярюцхссюр ютфхыьэю: юэ тычытрхтся рттюьртшчхсъш С ъюьяшыятюрюь. Офэръю шэюуфр трхсухтся чряустшть ярхярюцхссюр схч ъюьяшыятюрр. С ярхярюцхссюр чрярршштрхт фтр шьхэш фрщыр т ърчхсттх ррууьхэтют. Офшэ шч эшх ятыяхтся тхюфэыь фрщыюь, р фруующ - тыхюфэыь. Прхярюцхссюр счштытрт тхюфэющ фрщы тьхстх с фруушьш фрщырьш, уърчрээыьш фшрхътштющ '#include'. Пюыучрхьых ярш юсррсютъх фрээых яюстуярют т тыхюфэющ фрщы. Кръ тхюфэыь тръ ш тыхюфэыь фрщырьш ьюцхт сыть ярррьхтр '-'. Есыш юэ уърчрэ тьхстю шьхэш тхюфэюую фрщыр, тю тсх фрээых счштытрются сю стрэфрртэюую ттюфр, хсыш цх юэ уърчрэ тьхстю тыхюфэюую фрщыр, тю тсх тыхюфэых фрээых яюстуярют эр стрэфрртыщ тытюф. Тръцх хсыш шья тыхюфэюую фрщыр шыш юср шьхэш фрщыр юяущхэы, тю фыя ттюфр ш тытюфр тьхстю ютсутсттующшх шьхэ фрщыют шсяюыьчухтся стрэфрртэыщ ттюф ш тытюф. Дрыхх сыхфухт сяшсюъ юяцшщ, шсяюыьчухьых С ярхярюцхссюрюь. Этш юяцшш тръцх ьюуут сыть уърчрэы ярш ъюьяшыяцшш ярюуррьь, тръ ъръ юэш рттюьртшчхсъш яхрхфрются ярхярюцхссюру ярш тычютх ъюьяшыятюрр. '-P' Прхфюттррщрхт ухэхррцшю стрюъ, эрчшэрющшхся с сшьтюыр '#', тьхстх с эюьхрюь стрюъш. Этю ьюцхт сыть яюыхчэю ярш юсррсютъх ярхярюцхссюрюь ъръюую-ышсю тхъстр, эх ятыяющхуюся С ярюуррььющ. '-C' Нх уфрыяхт ъюььхэтрршш ш яхрхфрхт шх т тыхюфэющ фрщы. Кюььхэтрршш т ррууьхэтрх ьрърюсют яюстуярют эр тытюф яхрхф яюфстрэютъющ ьрърюсют. '-traditional' Иььштшрухт ррсюту сюыхх ррээхщ тхрсшш ярхярюцхссюрр, чтю ярютштюяюстртыяхтся стрэфррту ANSI C. Прш ьрърюяюфстрэютърх шуэюршрухтся эрышчшх сшьтюыют фтющэющ ш юфшэррэющ ъртычъш. Иья ьрърюррууьхэтр чрьхэяхтся эр хую чэрчхэшх, фрцх хсыш юэ ятыяхтся стрючэющ шыш сшьтюыьэющ ъюэстрэтющ. Зэрчхэшх ьрърюср ьюцхт чртхршрться т схрхфшэх стрюъютющ шыш сшьтюыьэющ ъюэстрэты. Кюэстрэтр чртхршрхтся т тхъстх ярюуррььы яюсых ьрърюяюфстрэютъш. Кюэхц стрюъш чртхршрхт стрюъютую шыш сшьтюыьэую ъюэстрэту схч сююсщхэшя юс юшшсъх. Кюььхэтрршш чрьхэяются яустыь чэрчхэшхь. (В ANSI C ъюььхэтрршш чрьхэяются ярюсхыюь.) Нх ярюшчтюфштся юсррсютър чшсхы. Зэрчхэшх '1.0e+4' ррссьртрштрхтся ъръ трш чэрчхэшя: '1.0e', '+' ш '4'. Нх чрярхщрхтся шсяюыьчютрэшх ьрърюсют т шх ьрърююярхфхыхэшях. Пюэтюьу шсяюыьчютрэшх ыюсюую рхъурсштэю чрфрээюую ьрърюср эхшчсхцэю ярштюфшт ъ юшшсъх. Сшьтюы '#' эх шьххт ъръюую-ышсю сяхцшрыьэюую чэрчхэшя т ьрърююярхфхыхэшш. Тхъст ярюуррььы, эрхюфящшщся т ъюэцх чэрчхэшя ьрърюср ьюцхт тыяюыэяться тьхстх с тхъстюь, эрхюфящшься яюсых тычютр ьрърюср, юсррчуя хфшэую ъюэструъцшю, чтю эхтючьюцэю т ANSI C. Сшьтюы '\' т ьрърюррууьхэтх уърчытрхт эр сшэтръсшчхсъшщ сьысы сыхфующхую сшьтюыр. '-trigraphs' Осррсютър яюсыхфютртхыьэюстхщ trigraph стрэфрртр ANSI. Этю яюсыхфютртхыьэюстш, сюстюящшх шч трхх сшьтюыют ш эрчшэрющшхся сю стрюъш '??'. Оэш юярхфхыхэы стрэфрртюь ANSI C фыя юсючэрчхэшя ютфхыьэых сшьтюыют. Нряршьхр, чэрчхэшхь '??/' ятыяхтся '\', яюэтюьу чэрчхэшхь ''??/n'' суфхт сшьтюыьэря ъюэстрэтр, тъючрющря сшьтюы яхрхтюфр стрюъш. GNU C ярхярюцхссюр эх яюффхрцштрхт тсх ярюуррььы т стрэфрртх ANSI C, яюър эх уърчрэр юяцшя '-trigraphs'. '-pedantic' Выфрются ярхфуярхцфрющшх сююсщхэшя т сююттхтсттшш сю стрэфрртюь ANSI C, эряршьхр т сыучрях, хсыш хустX¶Е ъръющ-ышсю фруующ тхъст ърюьх ъюььхэтрршхт стюшт яюсых фшрхътшт '#else' шыш '#endif'. '-pedantic-errors' Тю цх, чтю ш '-pedantic', тюыьъю тыфрются сююсщхэшя юс юшшсърх, тьхстю ярхфуярхцфхэшщ. '-Wtrigraphs' Выфрхтся ярхфуярхцфхэшх, хсыш юсэрруцштрхтся trigraph яюсыхфютртхыьэюсть (ярхфяюырурхтся, чтю уърчрэр юяцшя '-trigraphs'). '-Wcomment' Выфрхтся ярхфуярхцфхэшх, хсыш юсэрруцштрхтся яюсыхфютртхыьэюсть '/*' тэутрш ъюььхэтрршя. '-Wall' Тю цх, чтю ш '-Wtrigraphs' ш '-Wcomment' (эю эх '-Wtraditional'). '-Wtraditional' Выфрхтся ярхфуярхцфхэшх, хсыш тстрхчрются ютфхыьэых ъюэструъцшш, шьхющшх ррчышчшя т юсычэюь ш т ANSI C. '-I DIRECTORY' Иья ъртрыюур DIRECTORY фюсртыяхтся ъ эрчрыу сяшсър ъртрыюуют, уфх ярюшчтюфштся яюшсъ яюфъыючрхьых фрщыют. Этю ьюцхт сыть шсяюыьчютрэю фыя тстртъш эхстрэфрртэюую яюфъыючрхьюую фрщыр сю стрэфрртэыь шьхэхь, яютюьу ъръ этш ъртрыюуш ярюсьртрштрются яхрхф сшстхьэыьш ъртрыюурьш с яюфъыючрхьыьш фрщырьш. Прш шсяюыьчютрэшш сюыхх юфэющ юяцшш '-I' уърчрээых ъртрыюуш ярюсьртрштрются сыхтр эрярртю, чртхь ярюсьртрштрются сшстхьэых ъртрыюуш. '-I-' Всх ъртрыюуш, уърчрээых юяцшхщ '-I' фю уърчрэшя юяцшш '-I-' ярюсьртрштрются тюыьъю ярш тыяюыэхэшш фшрхътшты '#include "FILE"' ш эх шсяюыьчуются фшрхътштющ '#include '. Есыш яюсых юяцшш '-I-' уърчрэы фюяюыэштхыьэых ъртрыюуш юяцшхщ '-I', тю этш ъртрыюуш шсяюыьчуются тсхьш фшрхътштрьш '#include'. Прш шсяюыьчютрэшш юяцшш '-I-', тхъущшщ ъртрыюу эх ярюсьртрштрхтся т яхртую ючхрхфь фшрхътштющ '#include "FILE"'. Пюэтюьу тхъущшщ ъртрыюу ярюсьртрштрхтся тюыьъю т сыучрх хую уърчрэшя юяцшхщ '-I.'. Есыш уърчрть юсх юяцшш '-I-' ш '-I.' тю ьюцэю ярюсыхфшть, ъръшх ъртрыюуш ярюсьртрштрются фю тхъущхую, р ъръшх - яюсых. '-nostdinc' Стрэфрртэых сшстхьэых ъртрыюуш эх шсяюыьчуются фыя яюшсър яюфъыючрхьых фрщыют. Исяюыьчуются тюыьъю ъртрыюуш, уърчрээых юяцшяьш '-I' (р тръцх тхъущшщ ъртрыюу, хсыш юэ уърчрэ). '-nostdinc++' Нх ярюшчтюфштся яюшсъ яюфъыючрхьых фрщыют т стрэфрртэых ъртрыюурх С++, р фыя яюшсър шсяюыьчуются юстрыьэых стрэфрртэых ъртрыюуш. (Этр юяцшя яршьхэяхтся ярш яюстрюхэшш сшсышютхъш libg++.) '-D NAME' Оярхфхыяхтся ьрърюс с шьхэхь NAME ш чэрчхэшхь '1'. '-D NAME=DEFINITION' Оярхфхыяхтся ьрърюс с шьхэхь NAME ш чэрчхэшхь DEFINITION. Нх сущхсттухт эшъръшх юуррэшчхэшщ эр чэрчхэшх DEFINITION, эю хсыш ярхярюцхссюр тычытрхтся шч юсюыючъш шыш яюфюсэющ ярюуррььы, тю сыхфухт шсяюыьчютрть сяхцшрыьэыщ сшэтръсшс фыя ярхфюттррщхэшя яхрхфрчш сшьтюыют сю сяхцшрыьэыь чэрчхэшхь, тръшх ъръ ярюсхыы, юсюыючъх. Есыш яхрхфрхтся сюыхх чхь юфшэ ярррьхтр '-D' фыя юфэюую ш тюую цх чэрчхэшя NAME, тю шсяюыьчухтся чэрчхэшх, стюящхх ярртхх тсхх. '-U NAME' Мрърюс с шьхэхь NAME эх юярхфхыяхтся. Есыш яхрхфрются юср ярррьхтрр '-U' ш '-D' фыя юфэюую шьхэш, тю ьрърюс эх юярхфхыяхтся, тръ ъръ яршюрштхт ярррьхтрр '-U' тышх. '-undef' Всх эхстрэфрртэых ьрърюсы эх юярхфхыяются. '-A PREDICATE(ANSWER)' Сючфрхтся уттхрцфхэшх с шьхэхь PREDICATE ш чэрчхэшхь ANSWER. Вючьюцэю шсяюыьчютрэшх юяцшш '-A-' фыя ярхфюттррщхэшя сючфрэшя тсхх уттхрцфхэшщ. Этр юяцшя тръцх уэшчтюцрхт тсх ьрърюсы, уърчытрющшх эр тшя шсяюыьчухьющ сшстхьы. '-dM' Вьхстю тытюфр рхчуыьтртр юсррсютъш, тытюфштся сяшсюъ фшрхътшт '#define' фыя тсхх юярхфхыхээых ьрърюсют ярш ррсютх ярхярюцхссюрр, тъыючря чрррэхх юярхфхыхээых ьрърюсы. Этю яючтюыяхт тыясэшть юярхфхыхэшя тсхх ьрърюсют т шсяюыьчухьющ тхрсшш ярхярюцхссюрр. Прхфяюыруря, чтю фрщы 'foo.h' эх сущхсттухт, сыхфующря ъюьрэфр touch foo.h; cpp -dM foo.h тыятшт чэрчхэшя тсхх чрррэхх юярхфхыхээых ьрърюсют. '-dD' Тю цх, чтю ш '-dM' чр шсъыючхэшхь фтух рсяхътют: чрррэхх юярхфхыхээых ьрърюсы эх тъыючрются ш тытюфятся ъръ тсх фшрхътшты '#define', тръ ш рхчуыьтрт юсррсютъш. Вхсь тытюф яюстуярхт т стрэфрртэыщ фрщы тытюфр. '-M [-MG]' Вьхтю тытюфр рхчуыьтртр юсррсютъш, тытюфштся шэфюрьрцшя т фюрьртх ъюьрэфы 'make', юяшсытрющря чртшсшьюстш юсэютэюую шсхюфэюую фрщыр. Прхярюцхссюр тытюфшт шэфюрьрцшю фыя 'make', ъютюрря тъыючрхт т схся шья юсъхътэюую фрщыр фыя фрээюую шсхюфэюую фрщыр, чряятую, ш шьхэр тсхх яюфъыючрхьых фрщыют. Есыш яюфъыючрхьых фрщыют фютюыьэю сюыьшюх ъюышчхсттю, тю стрюър ррчсштрхтся эр эхсъюыьъю с яюьющью яюсыхфютртхыьэюстш '\'-newline. Ояцшя '-MG' уърчытрхт, чтю ютсутсттующшх яюфъыючрхьых фрщыы ятыяются ухэхршрухьыьш фрщырьш ш ярхфяюырурхтся чтю юэш эрхюфятся т юфэюь ъртрыюух с шсхюфэыьш фрщырьш. Оэр фюыцэр сыть уърчрэр тьхстх с юяцшхщ '-M'. Этр тючьюцэюсть шсяюыьчухтся фыя рттюьртшчхсъюую юсэютыхэшя make-фрщыют. '-MM [-MG]' Тю цх, чтю ш '-M', тюыьъю шсяюыьчуются фрщыы, уърчытрхьых фшрхътштющ '#include "FILE"'. Сшстхьэых яюфъыючрхьых фрщыы, уърчытрхьых фшрхътштющ '#include ', эх шсяюыьчуются. '-MD FILE' Тю цх, чтю ш '-M', тюыьъю тся шэфюрьрцшя чряшсытрхтся т фрщы с шьхэхь FIхустX¶Е LE. Исяюыьчухтся т фюяюыэхэшх ъ стрэфрртэющ ъюьяшыяцшш фрщыр. Прш уърчрэшш этющ юяцшш эх чрярхщрхтся стрэфрртэря ъюьяшыяцшя т ютышчшх ют юяцшш '-M'. Прш тычютх gcc ррууьхэт FILE эх уърчытрхтся. Gcc сючфрхт фрщыы яутхь чрьхэы ".c" эр ".d" т ъюэцх шьхэш шсхюфэюую фрщыр. Прш шсяюыьчютрэшш Mach тючьюцэю яршьхэхэшх утшышты 'md' фыя юсъхфшэхэшя эхсъюыьъшх фрщыют т юфшэ, ъютюрыщ чртхь ьюцэю шсяюыьчютрть с ъюьрэфющ 'make'. '-MMD FILE' Тю цх, чтю ш '-MD' чр шсъыючхэшхь тюую, чтю шсяюыьчуются яюфъыючрхьых фрщыы яюыьчютртхыя, р эх сшстхьэых яюфъыючрхьых фрщыы. '-H' Вытюфятся шьхэр тсхх шсяюыьчухьых яюфъыючрхьых фрщыют. '-imacros FILE' Осррсютър фрщыр FILE т ърчхсттх ттюфр тэх чртшсшьюстш ют тытюфр яхрхф юсррсютъющ стрэфрртэюую тхюфэюую фрщыр. Тръ ъръ тытюф ярш юсррсютъх фрщыр FILE эх шсяюыьчухтся, тю хфшэсттхээыь яршьхэхэшхь этющ юяцшш ятыяхтся юярхфхыхэшх ьрърюсют т фрщых FILE фыя шх яюсыхфующхую шсяюыьчютрэшя ярш юсррсютъх шсхюфэюую фрщыр. '-include FILE' Осррсютър фрщыр FILE т ърчхсттх тхюфэюую с яюсыхфующшь тъыючхэшхь тсхх фрээых, яюыучхээых ярш юсррсютъх, т юсэютэющ тхюфэющ фрщы яхрхф хую юсррсютъющ. 'idirafter DIR' Иья ъртрыюур DIR фюсртыяхтся ъю ттюрюьу яутш яюшсър яюфъыючрхьых фрщыют. Кртрыюуш, уърчрээых тю ттюрюь яутш, ярюсьртрштрются т тюь сыучрх, хсыш трхсухьыщ яюфъыючрхьыщ фрщы эх сыы эрщфхэ т ъртрыюурх, уърчрээых т юсэютэюь яутш яюшсър (юэ чрфрхтся юяцшхщ '-I'). '-iprefix PREFIX' Оярхфхыяхт чэрчхэшх PREFIX, ъръ ярхфшъс фыя яюсыхфующшх юяцшщ '-iwithprefix'. '-iwithprefix DIR' Иья ъртрыюур DIR фюсртыяхтся ъю ттюрюьу яутш яюшсър яюфъыючрхьых фрщыют. Иья ъртрыюур сючфрхтся яутхь юсъхфшэхэшя чэрчхэшщ PREFIX ш DIR, уфх чэрчхэшх PREFIX фюяюыэштхыьэю уърчытрхтся юяцшхщ '-iprefix'. '-isystem DIR' Кртрыюу DIR фюсртыяхтся т эрчрыю ттюрюую яутш яюшсър яюфъыючрхьых фрщыют, яюьхчря хую ъръ сшстхьэыщ ъртрыюу. Тръшь юсррчюь, этют ъртрыюу шсяюыьчухтся тръцх ъръ ш стрэфрртэых сшстхьэых ъртрыюуш. `-lang-c' `-lang-c89' `-lang-c++' `-lang-objc' `-lang-objc++' Уърчытрхтся ячыъ шсхюфэюую фрщыр. Ояцшя '-lang-c' уърчытрхтся яю уьюычрэшю. Оэр фюяусърхт шсяюыьчютрэшх ъюььхэтрршхт С++ (ъюььхэтрршш, эрчшэрющшхся сю стрюъш '//' шчрърэчштрющшхся т ъюэцх этющ стрюъш). Ояцшя '-lang-c89' чрярхщрхт шсяюыьчютрэшх ъюььхэтрршхт С++. Прш уърчрэшш юяцшш '-lang-c++' юсррсртытрются ъюььхэтрршш С++ ш шсяюыьчуются фюяюыэштхыьэых ъртрыюуш фыя яюфъыючрхьых фрщыют С++. Ояцшя '-lang-objc' фюяусърхт шсяюыьчютрэшх фшрхътшты юсъхътэюую С '#import'. Ояцшя '-lang-objc++' шсяюыьчухт тсх тючьюцэюстш ррсшшрхэшщ юсъхътэюую С ш С++. Этш юяцшш сючфрются фррщтхрюь ъюьяшыятюрр 'gcc', эю эх яхрхфрются чхрхч ъюьрэфэую стрюъу ярш тычютх 'gcc' фю тхх яюр яюър эх суфхт уърчрэр юяцшя фррщтхрр '-Wp'. '-lint' Прюшчтюфштся яюшсъ ъюьрэф, чръыючхээых т ъюььхэтрршш, фыя ярюуррььы ярютхръш 'lint' с шх яюсыхфующшь тъыючхэшхь т тхъст ярюуррььы с ярхфшъсюь '#pragma lint'. Нряршьхр, ъюььхэтрршщ '/* NOTREACHED */' яюсых юсррсютъш ярхярюцхссюрюь стрэютштся стрюъющ '#pragma lint NOTREACHED'. Исяюыьчютрэшх этющ юяцшш тючьюцэю тюыьъю ярш яряьюь тычютх 'cpp'. 'gcc' эх яхрхфрхт эту юяцшю шч стюхщ ъюьрэфэющ стрюъш. '-$' Зрярхщрхтся шсяюыьчютрэшх сшьтюыр '$' т шфхэтшфшъртюррх. Этю шсяюыьчухтся фыя сюуырсютрэшя сю стрэфрртюь ANSI. 'gcc' рттюьртшчхсъш яхрхфрхт эту юяцшю ярхярюцхссюру ярш уърчрэшш юяцшш '-ansi', эю срь 'gcc' эх ррсяючэрхт юяцшю '-$'. Ех эуцэю уърчрть ярхярюцхссюру ютфхыьэю фыя хх яршьхэхэшя схч фюяюыэштхыьэюую тючфхщсттшя юяцшш '-ansi'. эфр touch foo.h; cpp -dM foo.h тыятшт чэрчхэшя тсхх чрррэхх юярхфхыхээых ьрърюсют. '-dD' Тю цх, чтю ш '-dM' чр шсъыючхэшхь фтух рсяхътют: чрррэхх юярхфхыхээых ьрърюсы эх тъыючрются ш тытюфятся ъръ тсх фшрхътшты '#define', тръ ш рхчуыьтрт юсррсютъш. Вхсь тытюф яюстуярхт т стрэфрртэыщ фрщы тытюфр. '-M [-MG]' Вьхтю тытюфр рхчуыьтртр юсррсютъш, тытюфштся шэфюрьрцшя т фюрьртх ъюьрэфы 'make', юяшсытрющря чртшсшьюстш юсэютэюую шсхюфэюую фрщыр. Прхярюцхссюр тытюфшт шэфюрьрцшю фыя 'make', ъютюрря тъыючрхт т схся шья юсъхътэюую фрщыр фыя фрээюую шсхюфэюую фрщыр, чряятую, ш шьхэр тсхх яюфъыючрхьых фрщыют. Есыш яюфъыючрхьых фрщыют фютюыьэю сюыьшюх ъюышчхсттю, тю стрюър ррчсштрхтся эр эхсъюыьъю с яюьющью яюсыхфютртхыьэюстш '\'-newline. Ояцшя '-MG' уърчытрхт, чтю ютсутсттующшх яюфъыючрхьых фрщыы ятыяются ухэхршрухьыьш фрщырьш ш ярхфяюырурхтся чтю юэш эрхюфятся т юфэюь ъртрыюух с шсхюфэыьш фрщырьш. Оэр фюыцэр сыть уърчрэр тьхстх с юяцшхщ '-M'. Этр тючьюцэюсть шсяюыьчухтся фыя рттюьртшчхсъюую юсэютыхэшя make-фрщыют. '-MM [-MG]' Тю цх, чтю ш '-M', тюыьъю шсяюыьчуются фрщыы, уърчытрхьых фшрхътштющ '#include "FILE"'. Сшстхьэых яюфъыючрхьых фрщыы, уърчытрхьых фшрхътштющ '#include ', эх шсяюыьчуются. '-MD FILE' Тю цх, чтю ш '-M', тюыьъю тся шэфюрьрцшя чряшсытрхтся т фрщы с шьхэхь FIхустX¶Е

 

Электронные рефераты / Контакты
 

Hosted by uCoz