|
Часть 7
Математическое обеспечение
персональных ЭВМ
TURBO-C
Описание компилятора
Москва 1988
- 2 -
Аннотация
В данном документе приведено краткое описание вызова ком-
пилятора Turbo-C и его возможностей. Приведено краткое описание
библиотеки компилятора. Документ является переработкой "Turbo-C
User's Manual". Авторы: Кашкарова В.А., Артамоненкова Н.Н.,
Стариков Ю.А. (ГВМЦ СИ).
- 3 -
Содержание
Аннотация................................................. 2
1. ОПЦИИ КОМАНДНОЙ СТРОКИ.................................... 5
1.1. СИНТАКСИС.............................................. 5
1.2. ОПЦИИ МОДЕЛЕЙ ПАМЯТИ................................... 6
1.3. ОПРЕДЕЛЕНИЯ............................................ 7
1.4. ОПЦИИ ПРОЦЕССОРА....................................... 7
1.5. ИСХОДНЫЕ ОПЦИИ......................................... 8
1.6. ОПЦИИ КОДА............................................. 9
1.7. ОПЦИИ ОБРАБОТКИ ОШИБОК.................................11
1.8. ОПЦИИ ИМЕН.............................................13
1.9. ОПЦИИ УПРАВЛЕНИЯ КОМПИЛЯЦИЕЙ...........................14
1.10. ОПЦИИ РЕДАКТОРА СВЯЗЕЙ.................................15
1.11. ОПЦИИ ОКРУЖЕНИЯ........................................15
2. УТИЛИТЫ TURBO-С...........................................16
2.1. ПРЕПРОЦЕССОР Turbo-C...................................16
2.2. УТИЛИТА MAKE...........................................16
2.2.1. КОМАНДНЫЕ СПИСКИ......................................16
2.2.2. МАКРООПРЕДЕЛЕНИЯ......................................17
2.2.2.1. ОПРЕДЕЛЕНИЕ МАКРОСОВ................................18
2.2.2.2. ИСПОЛЬЗОВАНИЕ МАКРОСОВ..............................18
2.2.2.3. ОСОБЫЕ СЛУЧАИ.......................................18
2.2.2.4. ПРЕДОПРЕДЕЛЕННЫЕ МАКРОСЫ............................19
2.2.2.5. ДИРЕКТИВЫ...........................................20
2.2.3. ВЫЗОВ MAKE............................................23
2.2.3.1. СИНТАКСИС КОМАНДНОЙ СТРОКИ..........................23
2.2.3.2. ФАЙЛ BULTINS.MAK....................................23
2.2.3.3. ОПЦИИ КОМАНДНОЙ СТРОКИ..............................23
2.3. РЕДАКТОР СВЯЗЕЙ Turbo-C................................24
2.3.1. ИНИЦИАЛИЗАЦИОННЫЕ МОДУЛИ..............................24
2.3.2. БИБЛИОТЕКИ............................................25
2.3.3. ИСПОЛЬЗОВАНИЕ TLINK с TCC.............................25
2.3.4. ОПЦИИ РЕДАКТОРА СВЯЗЕЙ................................25
2.3.5. ОГРАНИЧЕНИЯ...........................................26
3. ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ Turbo-C............................28
3.1. ABSREAD................................................28
3.2. ABSWRITE...............................................29
3.3. ALLOCMEM...............................................29
3.4. ATEXIT.................................................31
3.5. ATOF...................................................32
3.6. BIOSCOM................................................33
3.7. BIOSDISK...............................................35
- 4 -
3.8. BIOSEQUIP..............................................37
3.9. BIOSKEY................................................38
3.10. BIOSMEMORY.............................................39
3.11. BIOSPRINT..............................................39
3.12. BIOSTIME...............................................40
3.13. BRK....................................................40
3.14. COUNTRY................................................40
3.15. CTRLBRK................................................42
3.16. DISABLE................................................43
3.17. DOSTOUNIX..............................................44
3.18. FARMALLOC..............................................44
3.19. FINDFIRST..............................................45
3.20. FNMERGE................................................47
3.21. GETCBRK................................................50
3.22. GETCURDIR..............................................50
3.23. GETCWD.................................................50
3.24. GETDATE................................................51
3.25. GETDFREE...............................................51
3.26. GETDISK................................................52
3.27. GETDTA.................................................52
3.28. GETFAT.................................................52
3.29. GETFTIME...............................................53
3.30. GETPASS................................................53
3.31. GETPSP.................................................54
3.32. GETVECT................................................54
3.33. GETVERIFY..............................................55
3.34. HARDERR................................................55
3.35. INPORT.................................................57
3.36. INTR...................................................57
3.37. IOCTL..................................................57
3.38. ISATTY.................................................58
3.39. KEEP...................................................58
3.40. LOCK...................................................59
3.41. MOVMEM.................................................59
3.42. PARSFNM................................................59
3.43. PEEK...................................................60
3.44. POKE...................................................60
3.45. POLY...................................................60
3.46. RANDBRD................................................61
3.47. SEARCHPATH.............................................61
3.48. SETCBRK................................................62
3.49. SLEEP..................................................62
3.50. SSIGNAL................................................62
Приложение. ОБЩИЕ СТАНДАРТНЫЕ ФУНКЦИИ MSC и Turbo-C..........63
- 5 -
1. ОПЦИИ КОМАНДНОЙ СТРОКИ
Данный раздел содержит опции командной строки для вызова
компилятора Turbo-C. Все опиции компилятора можно разделить на
три следующих типа:
- опции компилятора;
- опции редактора связей;
- опции окружения.
Опции компилятора подразделяются:
- опции моделей памяти;
- определения (опции макро определений);
- опции процессора;
- опции исходного кода;
- опции сообщений об ошибках;
- имена (имена сегментов).
Большинство опций командной строки имеют аналоги в Меню
Опций в системе Turbo-C (или в некоторых других меню).
В командной строке каждой опции должен предшествовать сим-
вол (-). Например, -I. Для того, чтобы отменить опцию добавьте
еще один (-) после опции. Например, -A включает опцию ключевых
слов ANSI, а -A- отменяет данную опцию.
1.1. СИНТАКСИС
При вызове компилятора Turbo-C вы можете использовать ко-
мандную строку, которая имеет следующий синтаксис:
tcc [опции... ] имена_файлов
Компилятор обрабатывает файлы в соответствии с приведенны-
ми ниже правилами.
filename.asm: вызывается MASM при ассемблировании
(получении объектного файла).
- 6 -
filename.obj: подключается объектный файл при работе ре-
дактора связей.
filename.lib: подключается библиотека при работе редак-
тора связей.
filename: компилируется filename.c
filename.c: компилируется filename.c
filename.xyz: компилируется filename.xyz.
Например, командная строка
tcc -a -f -C -O -Z -emyexe oldfile1.c oldfile2.c nextfile.c
задает компиляцию файлов OLDFILE1.C, OLDFILE2.C, NEXTFILE.C в
файл .OBJ, помещая выполняемую программу в файл MYEXE.EXE; (-a)
задает выравнивание слова, (-f) - эмуляцию плавающей точки, (-
C) указывает на вложенные комментарии, (-O) - оптимизация пере-
ходов, (-Z) - регистровая оптимизация.
TCC будет подключать MASM, если вы укажите файл с расшире-
нием .ASM в командной строке или если файл .C содержит
встроенный ассемблер. Для подключения макроассемблера в команд-
ной строке нужно указать следующие флаги:
/ms /D_mdl_,
где mld должно принимать одно из значений: TINY, SMALL, MEDIUM,
COMPACT, LARGE или HUGE. Флаг /mx указывает MASM на необходи-
мость ассемблирования с учетом регистров.
1.2. ОПЦИИ МОДЕЛЕЙ ПАМЯТИ
-mc
при компиляции используется модель памяти COMPACT.
-mh
используется модель памяти HUGE.
-ml
используется модель памяти LARGE.
- 7 -
-mm
используется модель памяти MEDIUM.
-ms
используется модель памяти SMALL (по умолчанию).
-mt
используется модель памяти TINY (крошечная). Создается
почти такой же код как и в предыдущем случае, но всегда
используется C0T.OBJ при работе редактора связей.
1.3. ОПРЕДЕЛЕНИЯ
-Dxxx
Определяет идентификатор xxx как строку состоящую из
единственного пробела ( ).
-Dxxx=string
Определяет идентификатор xxx как строку string. String
не может содержать пробелы и табуляции.
-Uxxx
Отменяет установленные определения для идентификатора
xxx.
1.4. ОПЦИИ ПРОЦЕССОРА
-1
генерация расширенных команд процессора 80186. Эта опция
также используется при генерации программ процессором
80286 в незащищенном режиме, например, IBM PC/AT c MS-
DOS 3.0.
-a
приводит к выравниванию целых данных по границе машинно-
го слова. Крайние биты будут включаться в структуру, для
того чтобы обеспечить выравнивание полей. Выравнивание
автоматических и глобальных переменных будет проходить
успешно, переменные типа char и unsigned char могут быть
помещены по любым адресам; все остальные - должны быть
помещены по четным адресам.
-f87
генерация операций плавающей точки, используя команды
встроенного сопроцессора 8087, а не библиотеку эмулятора
8087.
- 8 -
-f
во время выполнения вызывается эмулятор 8087, если ис-
полняющая система не имеет сопроцессора 8087, который
вызывается по умолчанию для выполнения вычислений с пла-
вающей точкой.
-fуказывает
редактору связей, что программа не содержит вычислений с
плавающей точкой. Библиотеки плавающей точки не подклю-
чаются.
1.5. ИСХОДНЫЕ ОПЦИИ
-A
создается ANSI-совместимый код: любое ключевое слово
расширения Turbo-C игнорируется и может быть использова-
но как идентификатор. К ключевым словам расширения отно-
сятся:
near far huge cdecl
asm pascal interrupt
_es _ds _cs _ss
и регистровые псевдо-переменные, такие как _AX, _BX, _SI
и др.
-C
допускает вложенные комментарии.
-i#
Компилятор распознает только первые # символов идентифи-
каторов. Все идентификаторы, независимо от того являются
ли они переменными, именами макроопределений препроцес-
сора или именами структур, рассматриваются как различаю-
щиеся, если их первые # символов различны.
По умолчанию Turbo-C использует 32-символьные идентифи-
каторы. Другие системы, включая UNIX, используют 8-сим-
вольные идентификаторы, остальные символы игнорируются.
Данный флаг позволяет избежать конфликтных ситуаций при
использовании идентификаторов.
-K
компилятор рассматривает все описания типа char, как тип
unsigned char. Это допускается для совместимости с дру-
гими к компиляторами, которые считают тип char
беззнаковым.
- 9 -
1.6. ОПЦИИ КОДА
-d
сливаются совпадающие строки; это обеспечивает уменьше-
ние размера программ (по умолчанию).
-G
Компилятор создает большие модули, если возможно.
-N
генерация логики переполнения стека на вход каждой функ-
ции: это будет вызывать сообщение о переполнении стека,
каждый раз когда переполнение стека обнаружено. Если пе-
реполнение обнаружено, печатается сообщение "Stack
overflow!" и программа завершается с кодом 1.
-y
включает номера строк в объектный файл для использования
отладчика. Это приводит к увеличению размера объектного
файла, но не влияет на размер или скорость выполняемой
программы.
-O
оптимизация размера кода за счет исключения избыточных
переходов, реорганизации циклов и переключения операто-
ров.
-p
Компилятор порождает все вызовы подпрограмм и функций,
используя Паскалевскую последовательность передачи пара-
метров. Функции должны получать верное число и тип аргу-
ментов, в отличии от вызова стандартного С, который до-
пускает переменное число аргументов функции. Вы можете
использовать оператор cdecl, для того чтобы отменить
данную опцию и специально объявить функцию C-типа.
-rподавляет
использование регистровых переменных. При наличии данной
опции все ключевые слова register игнорируются. Если вы
имеете ассемблерный код, в котором не сохранены значения
регистров SI и DI, опция -r- позволяет вызвать данный
код из Turbo-C. Подавление регистровых переменных, в об-
щем случае, снижает эффективность кода, но может потре-
боваться, если вы хотите использовать существующие подп-
рограммы.
П_р_и_м_е_ч_а_н_и_е. Когда вы используете опцию -r-, исходный
файл, откомпилированный с опцией -r-, может вызывать коды, ко-
торые являются результатом компиляции без опции -r-, например,
модули системных библиотек. Однако, обратное неверно, т.е.
файл, откомпилированный с -r-, может быть вызван только из фай-
ла, также откомпилированного с -r-.
- 10 -
-r
допускает использование регистровых переменных (по умол-
чанию).
-Y
порождает стандартную запись активации стека, которая
используется отладчиком для трассировки стека вызванных
функций.
-Z
подавляет избыточные операции загрузки, используя ранее
сохраненное содержимое регистров и повторное использова-
ние их насколько возможно часто.
П_р_и_м_е_ч_а_н_и_е. Необходимо соблюдать осторожность при ис-
пользовании данной опции, т.к. компилятор может не обнаружить
ситуации, когда значение регистра косвенно запорчено
указателем.
Например, если переменная A загружена в регистр DX, она
сохраняется. Если переменной A присваивается значение, значение
DX обновляется, что указывает на то, что его содержимое не яв-
ляется более текущим. Если значение A обновляется косвенно
(используя указатель), Turbo-C не будет отлавливать данной си-
туации и будет продолжать "помнить", что DX содержит значение
A.
Оптимизация -Z предназначена для подавления загрузки ре-
гистров, когда значение, которое загружается, уже содержится в
регистре. Это позволяет исключить все команды, и также преобра-
зовать команды из ссылок в ячейки памяти, для того чтобы ис-
пользовать регистры.
Следующая искусственная последовательность команд иллюст-
рирует преимущества и недостатки оптимизации:
C-код Оптимизированный
ассемблер
funk()
{
int A, *P, B;
A=4; mov A,4
...
B=A; mov ax,A
mov B,ax
P=&A; lea bx,A
mov P,bx
*P=B+5; mov dx,ax
add dx,5
mov [bx],dx
printf("%d\n",A); push ax
}
- 11 -
Рассмотрим команду *P=B+5. Во-первых, для генерации кода
используется перемещение ax в dx. Без -Z опимизации перемещение
будет осуществляться из B. Во-вторых, *P указывает, что P уже
содержится в bx, поэтому перемещение из P в bx после команды
add должно быть исключено. Это усовершенствование безобидно и
обычно используется.
Однако, обращение к printf не корректно. Компилятор
"видит", что ax содержит значение A, и поэтому использует со-
держимое регистра, а не содержимое ячейки памяти. Printf будет
печатить величину 4, вместо правильного значения 9. Косвенное
назначение переменной P изменило значение переменой A.
Если бы оператор *P=B+5 был бы записан в виде A=B+5, ком-
пилятор обнаружил бы изменение значения.
Содержимое регистров сбрасывается всякий раз при вызове
функции, или когда достигнута точка, в которой может быть
выполнен переход (например метка, условный оператор, начало или
конец цикла). Из-за данного ограничения и небольшого числа ре-
гистров в процесоорах серии 8086, большинство программ, исполь-
зующих данную оптимизацию, будут работать неверно.
1.7. ОПЦИИ ОБРАБОТКИ ОШИБОК
-g#
прекращает компиляцию после # сообщений (предупреждений
или сообщений об ошибках).
-j#
прекращает компиляцию после # сообщений об ошибках.
-wxxx
Допускает сообщения-предупреждения, указанные в xxx. Оп-
ция -w-xxx подавляет указанные предупреждения. Возможные
значения для -wxxx:
(ANSI-нарушения)
-wdup
переопределение 'XXXXXXXX' не идентично
-wret
используется как пустой return, так и return(значение)
-wstr
'XXXXXXXXX' не часть структуры
- 12 -
-wstu
неопределена структура 'XXXXXXXX'
-wsus
вызывающее сомнение преобразование указателя
-wvoi
функции типа void не могут возвращать значение
-wzst
структура нулевой длины
(Общие ошибки)
-waus
'XXXXXXXX' определено, но не используется
-wdef
возможно использование 'XXXXXXXX' прежде определения
-weff
неэффективный код
-wpar
параметр 'XXXXXXXX' никогда не используется
-wpia
возможно неверное присвоение
-wrch
недостигаемый код
-wrvl
функция должна возвращать значение
(Менее типичные ошибки)
-wamb
неоднозначные операторы; требуются скобки
-wamp
излишний &, примененный к функции или массиву
-wnod
нет описания для функции 'XXXXXXXX'
-wpro
обращение к функции не совпадает с формальным описанием
(макетом)
-wstv
structure passed by value
- 13 -
-wuse
'XXXXXXXXX' объявлена, но не используется
(Предупреждения по мобильности)
-wart
немобильное назначение указателя
-wcln
длинная константа
-wcpt
немобильное сравнение указателей
-wdgn
константа выходит за пределы диапазона при сравнении
-wrpt
немобильный возврат преобразования типов
-wsig
при преобразовании могут быть потеряны значащие разряды
-wucp
смешивание указателей на знаковый и беззнаковый тип char
1.8. ОПЦИИ ИМЕН
-zAname
Изменяет имя класса кодового сегмента на name. По умол-
чанию кодовому сегменту присваивается класс _CODE.
-zBname
Изменяет имя класса неинициализированного сегмента
данных на имя name. По умолчанию используется имя класса
_BSS.
-zCname
Изменяет имя кодового сегмента на имя name. По умолчанию
используется имя _TEXT, за исключением модели памяти ME-
DIUM, LARGE и HUGE, для которых используется имя filena-
me _TEXT. (В данном случае filename - имя исходного фай-
ла.)
-zDname
Изменяет имя неинициализированного сегмента данных на
name. По умолчанию используется _BSS, за исключением мо-
дели HUGE, для которой неинициализированные сегменты
данных не порождаются.
- 14 -
-zGname
Изменяет имя группы неинициализированного сегмента
данных на имя name. По умолчанию используется имя
DGROUP, за исключением модели HUGE, которая не имеет
групп данных.
-zPname
Приводит к тому, что все выходные файлы будут генериться
в кодовую группу в сегменте кода с именем name. Данная
опция не должна использоваться с модель TINY.
-zRname
Присваивает имя name инициализированному сегменту кода.
По умолчанию инициализированный сегмент кода называется
_DATA, исключение составляет модель памяти HUGE, которая
использует имя filename_DATA.
-zSname
Изменяет имя группы инициализированных сегментов кода на
name. По умолчанию всегда используется имя DGROUP, за
исключением модели HUGE, где не может быть групп данных.
Для данной модели флаг игнорируется.
-zTname
Присваивает имя name классу инициализированных сегментов
данных. По умолчанию используется имя _DATA.
-zX*
Использует имя по умолчанию для X: например, -zA* озна-
чает использование имени CODE для сегмента кода.
1.9. ОПЦИИ УПРАВЛЕНИЯ КОМПИЛЯЦИЕЙ
-B
Компиляция и вызов ассемблера для обработки встроенного
ассемблерного кода (могут быть части, написанные на ас-
семблере).
-c
Компиляция и ассемблирование файлов с расширениями .C и
.ASM, но без выполнения команды связи.
-ofilename
Результат компиляции помещается в файл с именем
filename.OBJ.
-S
Компиляция указанных исходных файлов и получение
выходных файлов на ассемблере; без выполнения ассембли-
рования.
- 15 -
1.10. ОПЦИИ РЕДАКТОРА СВЯЗЕЙ
-efilename
Имя выполняемой программы получается добавлением расши-
рения .EXE к filename (filename.EXE). При отсутствии
данной опции используется имя исходного или объектного
файла, указанное первым.
-M
Редактор связей формирует полную карту загрузки. По
умолчанию карта не формируется.
1.11. ОПЦИИ ОКРУЖЕНИЯ
-Idirectory
Include-файлы ищутся в каталоге directory, в дополнение
к поиску в стандартном каталоге. В качестве directory
может быть указан спецификатор устройства или полное имя
подкаталога. Спецификатор устройства должен заканчивать-
ся двоеточием (:). Возможно многократное использование
опции.
-Ldirectory
Редактор связей берет стартовый объектный файл C0x.OBJ и
библиотеки Turbo-C ( Cx.LIB, MATHx.LIB, EMU.LIB и
FP87.LIB) из указанного каталога. По умолчанию редактор
связей ищет их в текущем каталоге.
-nxxx
Помещает файл .OBJ или .ASM, созданный компилятором, в
каталог или на устройство, указанное в xxx.
- 16 -
2. УТИЛИТЫ TURBO-С
2.1. ПРЕПРОЦЕССОР Turbo-C
Утилита CPP - расширение компилятора Turbo-C. Препроцессор
используется для обработки исходных текстов C-программ, исполь-
зующих include-файлы и макро-определения.
Вызов: CPP
Результат работы препроцессора сохраняется в текущем ката-
логе в файле с именем, совпадающем с именем исходного файла, но
с расширением .I (Для того чтобы данный файл был записан в дру-
гой каталог, а не в текущий, задайте опицию -n.)
Опция -P сообщает препроцессору, что в каждой строке
выходного файла необходимо указывать имя исходного файла и но-
мер строки. Если задана опция -P-, препроцессор пропускает дан-
ную информацию. Если опция -P выключена, CPP может быть исполь-
зован как макропрепроцессор; файл .I в последствии можно отком-
пилировать, используя TCC или TC. По умолчанию считается, что
опция -P включена.
2.2. УТИЛИТА MAKE
2.2.1. КОМАНДНЫЕ СПИСКИ
Команды в списке команд MAKE-файла должны быть заданы в
следующем виде (команде предшествует по крайней мере один про-
бел или табуляция):
[prefix... ] command_body
Каждая команда состоит из списка префиксов, предшествующе-
го самой команды.
Префиксы, указанные в командах, изменяют обработку данных
команд утилитой MAKE. Префикс - это либо символ (@), либо (-),
за которым следует число.
@
MAKE не отображает команду на экран дисплея перед ее
выполнением. Команда не отображается, даже если опция -s
не была указана в командной строке при вызове MAKE.
- 17 -
-num
Если указано число num, MAKE будет аварийно завершаться
только в том случае, если статус завершения превышает
заданное число. Например:
-4 myprog sample.x
Если префикс -num не указан, MAKE проверяет статус завер-
шения для команды. Если статус завершения ненулевой, MAKE будет
прерван.
-
MAKE не будет проверять статус завершения. Независимо от
значения статуса MAKE будет продолжен.
Тело команды рассматривается точно также, как если бы она
была введена как командная строка для COMMAND.COM, исключение
составляют п перенаправление и фильтры, которые не
поддерживаются. MAKE выполняет следующие встроенные команды,
подключая копию COMMAND.COM:
break cd chdir cls copy
ctty date del dir erase
md mkdir path promt ren
rename set time type ver
verify vol
Для поиска команд MAKE использует алгоритм MS-DOS.
2.2.2. МАКРООПРЕДЕЛЕНИЯ
Определенные команды, имена файлов или опции могут часто
повторяться в make-файле. В таких случаях удобно использовать
макроопределения.
Макро - имя, которое представляет собой некоторую строку
символов. В макроопределении задается имя и текст расширения.
Впоследствии, когда MAKE встречает имя макроопределения, данное
имя заменяется на текст расширения.
Предположим, вы определили макрос MDL:
MDL=m
В дальнейшем, вы можете использовать макроподстановку
$(MDL).
Если вы хотите при очередном запуске MAKE использовать мо-
дель памяти LARGE, в вызове MAKE укажите опцию -D(Define):
make -DMDL=l
- 18 -
2.2.2.1. ОПРЕДЕЛЕНИЕ МАКРОСОВ
Все макроопределения должны иметь вид:
Имя_макро=Текст_расширения
Имя_макро - строка букв и цифр, не содержащая пробелов.
Текст_расширения - любая произвольная строка, содержащая
буквы, цифры, пробелы, знаки пунктуации, и завершающаяся симво-
лом перевода строки.
Переопределить макрос можно либо в тексте маке-файла, либо
используя опцию -D в командной строке вызова.
В именах макроопределений заглавные и строчные буквы раз-
личаются.
2.2.2.2. ИСПОЛЬЗОВАНИЕ МАКРОСОВ
Макрос включается в маке-файл в формате:
$(macro_name)
Скобки всегда должны присутствовать, даже если имя макроса
состоит из одного символа. Исключение составляют специальные
макросы, рассмотренные ниже.
Если MAKE встречает в тексте неопределенный макрос, он за-
мещается на пустую строку (NULL).
2.2.2.3. ОСОБЫЕ СЛУЧАИ
Макросы в макросе:
Макросы не могут включаться в левую часть макроопределе-
ния, т.е. в (macro_name). Они могут быть использованы в
правой части. Когда осуществляется макроподстановка, все
макросы, включенные в текст расширения, также подстав-
ляются.
Макросы в правилах:
В строках правил макроподстановка осуществляется тотчас
же.
Макросы в директивах:
В директивах !if и !elif макроподстановка осуществляется
немедленно. Если макрос, указанный в директиве, неопре-
делен, он рассматривается как 0 (FALSE).
- 19 -
Макросы в командах:
Макроподстановка в командах производится во время их
выполнения.
2.2.2.4. ПРЕДОПРЕДЕЛЕННЫЕ МАКРОСЫ
MAKE использует некоторые специальные макросы: $d, $*, $<,
$:, $. и $&. Первый из них определен как тест-макрос, исполь-
зуется в условных директивах !if и !elif; остальные - макросы
имен файлов, используется в определенных и подразумеваемых пра-
вилах. Кроме того, строки SET, устанавливающие текущее окруже-
ние, автоматически загружаются как макросы, и макроопределение
_MAKE_ определено как 1.
$d - тест-макрос
Тест-макрос заменяется 1, если определено имя макроса, и
0, в противном случае. Содержимое текста расширения мак-
роса безразлично. Данный макрос допускается только в ди-
рективах !if и !elif. Например, предположим вы хотите
модифицировать маке-файл, так чтобы он использовал сред-
нюю модель памяти. Добавте в начало маке-файла:
!if !$d(MDL) # Если MDL неопределено
MDL=m # Устанавливаем его в m (MEDIUM)
!endif
Различные макросы имен файлов:
$* - макроопределение основы имени файла
Макрос ($*) заменяется на имя файла, который должен быть
построен, без расширения. Например,
Имя файла: A:\P\TESTFILE.C
$* распространяется до: A:\P\TESTFILE
$< - макроопределение полного имени файла
Макрос ($<) заменяется на полное имя файла, который дол-
жен быть построен.
Имя файла: A:\P\TESTFILE.C
$< распространяется до: A:\P\TESTFILE.C
Например, правило:
startlib.obj: startlib.c
copy $< \oldobjs
tcc -c $*
будет копировать startlib.obj в каталог \oldobj, перед компиля-
цией startlib.c.
- 20 -
$: - макроопределение имени пути
Данный макрос заменяется на имя пути (без имени файла),
например:
Имя файла: A:\P\TESTFILE.C
$: распространяется до: A:\P\
$. - макроопределение имени файла и расширения
Имя файла: A:\P\TESTFILE.C
$. распространяется до: TESTFILE.C
$& - макроопределение только имени файла
Имя файла: A:\P\TESTFILE.C
$& распространяется до: TESTFILE
2.2.2.5. ДИРЕКТИВЫ
MAKE Turbo-C, в отличии от других версий MAKE, допускает
директивы, позволяющие включать другие маке-файлы, применять
правила и условные команды, печатать сообщения об ошибках и "не
определять" макросы.
Директивы начинаются с символа (!), который должен быть
первым символом строки.
Полный список директив MAKE:
!include
!if
!else
!elif
!endif
!error
!undef
ДИРЕКТИВЫ ВКЛЮЧЕНИЯ ФАЙЛОВ
ФОРМАТ
!include "filename"
Директивы могут иметь произвольную вложенность. При попыт-
ке включить файл, уже включенный на некотором внешнем уровне
вложенности, внутренняя директива будет игнорироваться как оши-
бочная.
- 21 -
УСЛОВНЫЕ ДИРЕКТИВЫ
Формат директив аналогичен формату директив C-препроцессо-
ра.
!if выражение
[строки]
!endif
!if выражение
[строки]
!else
[строки]
!endif
!if выражение
[строки]
!elif
[строки]
!endif
П_р_и_м_е_ч_а_н_и_е. [строки] могут быть следующие:
- макро-определения
- явное правило
- подразумеваемое правило
- include-директива
- if_group
- error-директива
- undef-директива
Условные директивы составляют группу, если имеется по
крайней мере одна директива !if, открывающая группу, и директи-
ва !endif, закрывающая ее.
Одна директива !else может присутствовать в группе.
Директивы !elif могут находиться между !if и !else.
Условные директивы могут быть вложенными.
ВЫРАЖЕНИЯ В УСЛОВНЫХ ДИРЕКТИВАХ
Выражения, допускающиеся в условных директивах, имеют син-
таксис аналогичный используемому в языке C. Выражение рассмат-
- 22 -
ривается как простое 32 разрядное целое выражение. Числа могут
задаваться как десятичные, восьмеричные или шестнадцатеричные
константы.
Выражения могут использовать следующие унарные операции:
-
отрицание
~
побитовое дополнение
!
логическое "не"
Выражения могут содержать следующие двоичные операторы:
+ сложение
- вычитание
* умножение
/ деление
" правая, левая кавычки
& поразрядное "и"
| поразрядное "или"
^ поразрядное исключающее "или"
&& логическое "и"
|| логическое "или"
>
<
>=
<=
==
!=
Выражение может включать тройной оператор ?.
Для группирования операндов могут быть использованы
скобки. При их отсутствии порядок выполнения операторов такой
же как в языке C.
ДИРЕКТИВА error
Данная директива вызывает прерывание MAKE и печать указан-
ного диагностического сообщения.
ФОРМАТ
!error любой_текст
ДИРЕКТИВА undef
ФОРМАТ
!undef имя_макро
- 23 -
Директива отменяет макро-определение. Игнорируется, если
макрос ранее не был определен.
2.2.3. ВЫЗОВ MAKE
2.2.3.1. СИНТАКСИС КОМАНДНОЙ СТРОКИ
Общий случай вызова MAKE:
make option option... target target
Option - опции MAKE, target - имя файла, к которому должны
быть применены указанные в MAKE правила.
MAKE прерывается, если какая-либо его команда завершилась
через control-break. Т.о., выполнение текущей команды и сам MA-
KE можно прервать по Ctrl-C.
2.2.3.2. ФАЙЛ BULTINS.MAK
В данный файл вы можете помещать наиболее часто исполь-
зуемые макро-определения и правила. При каждом запуске MAKE
ищет файл BULTINS.MAK; если данный файл существует, MAKE читает
его прежде чем MAKEFILE.
Поиск файла BULTINS.MAK осуществляется в текущем каталоге
или в любом каталоге, указанном в path. Желательно поместить
данный файл в тот же каталог, что и MAKE.EXE.
2.2.3.3. ОПЦИИ КОМАНДНОЙ СТРОКИ
-Didentifier
определяет указанный идентификатор как строку содержащую
единственный символ 1.
-Diden=string
определяет указанный идентификатор как строку со значе-
нием, стоящим после знака (=). Строка не модет содержать
пробелы или табуляции.
-Ldirectory
MAKE ищет включаемые файлы в указанном каталоге (так же
как и в текущем)
- 24 -
-Uidentifier
Отменяет ранее заданное определение идентификатора.
-s
Обычно, MAKE печатает каждую команду, которую выполняет.
При включении данной опции выполняемые команды не печа-
таются.
-n
MAKE печатает команды, но не выполняет их. Используется
при отладке.
-ffilename
Использует filename как MAKE файл. Если указанный файл
не существует, и не задано расширение, производится
попытка найти файл filename.mak.
-? или -h
Печатается help.
2.3. РЕДАКТОР СВЯЗЕЙ Turbo-C
Вызов
tlink C0x
|