3. Для имен макрофункций следует использовать прописные буквы. Это соглашение не распространяется так широко, как соглашение об использовании прописных букв для макроконстант. Применение их предостережет вас от возможных побочных эффектов макроопределений.
Предположим, что вы разработали несколько макрофункций по своему усмотрению. Должны ли вы их переопределять каждый раз, когда пишете новую программу? Нет, если вы вспомните о директиве #include.Теперь рассмотрим ее.
ВКЛЮЧЕНИЕ ФАЙЛА: #include
Когда препроцессор "распознает" директиву #include, он ищет следующее за ней имя файла и включает его в текущий файл. Директива выдается в двух видах:
#include имя файла в угловых скобках
#include "mystuff.h" имя файла в двойных кавычках
В операционной системе UNIX угловые скобки сообщают препроцессору, что файл следует искать в одном или нескольких стандартных системных каталогах. Кавычки говорят ему, что сначала нужно смотреть в вашем каталоге (или в каком-то другом, если вы определяете его именем файла), а затем искать в "стандартных" местах.
#include ищет в системном каталоге
#include "hot.h" ищет в вашем текущем рабочем каталоге
#include "/usr/biif/p.h" ищет в каталоге /usr/biff
В типичной микропроцессорной системе эти две формы являются синонимами, и препроцессор ведет поиск на указанном диске.
#include "stdio.h" ищет на стандартном диске
#include ищет на стандартном диске
#include "a : stdio.h" ищет на диске а
Зачем включают файлы? Потому что они несут нужную вам информацию. Файл stdio.h, например, обычно содержит определения EOF, getchar( )и putchar( ). Две последние Функции определены как макрофункции.
По соглашению суффикс .hиспользуется для "заголовочных" файлов, т. е. файлов с информацией, которая располагается в начале вашей программы. Заголовочные файлы обычно состоят из операторов препроцессора. Некоторые файлы, подобно stdio.h, включены в систему, но вы можете создать и свой собственный.
Пример:
Предположим, например, что вам правится использовать булевы переменные, т. с. вместо того чтобы иметь 1как "истину" и 0как "ложь", хотели бы использовать слова TRUEи FALSE. Можно создать файл, названный, скажем, bool.h, который содержал бы эти определения:
/* файл bool.h */
#define BOOL int;
#define TRUE 1
#define FALSE 0
Вот пример программы, использующей этот заголовок:
/* считает пустые символы */
#include
#include "bool.h"
main( )
{
int ch;
int count = 0;
BOOL whitesp( );
while((ch = getchar( )) != EOF)
if(whitesp(ch)) count++;
printf(" Имеется %d пустых символов. \n", count);
}
BOOL whitesp(c)
char c;
if(c == ' ' || с == '\n' || с == '\t')
return(TRUE);
else
return(FALSE);
}
1. Если две функции в этой программе ( 'main( )'и 'whitesp( )') следовало скомпилировать раздельно, то нужно было бы использовать директиву #include "bool.h"с каждой из них.
2. Выражение if(whitesp(ch))аналогично if(whitesp(ch)) == TRUE, так как сама функция whitesp(ch)имеет значение TRUEили FALSE.
3. Мы не создали новый тип BOOL, так как BOOLуже имеет тип int. Цель наименования функции BOOL- напомнить пользователю, что функция используется для логических вычислений (в противоположность арифметическим).
4. Использование функции в предусматриваемых логических сравнениях может сделать программу яснее. Она может также сэкономить наш труд, если сравнение встречается в программе более одного раза.
5. Мы могли бы использовать макроопределение вместо функции для задания whitesp( ).
Многие программисты разрабатывают свои стандартные заголовочные файлы, чтобы использовать их в программах. Некоторые файлы могут создаваться для специальных целей, другие можно использовать почти в каждой программе. Так как включенные файлы могут содержать директивы #include, можно, если хотите, создать сжатый, хорошо огранизованный заголовочный файл. Рассмотрим этот пример:
/*заголовочный файл mystuff.h*/
#include
#include "bool.h"
#include "funct.h"
#define YES 1
#define NO 0
Во-первых, мы хотим напомнить вам, что препроцессор языка Си распознает комментарии, помеченные /* и */, поэтому мы можем включать комментарии в эти файлы.
Читать дальше