/* Done by TheTutor -- 9/12/01
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
Эта обучалка о директивах препроцессора. Что же это такое? Есть "методы", которые
используются, чтобы файлы исходного кода было легко изменять и компилировать с
различными установками компилятора. Эти методы могут сделать ваш код гораздо более
легко читаемым и более пригодным к повторному использованию. Вы можете понять, что
видите директиву препроцессора, когда строка программы начинается с символа '#'.
Этот символ обязан быть первым символом строки, содержащей директиву препроцессора.
Директивы препроцессора обрабатываются ДО того, как компилируется исходный код.
Имеется довольно большое число директив препроцессора, но эта обучалка коснется
нескольких "основных" (полный список вы найдете в конце)
А сейчас несколько примеров...
*/
#include <stdio.h>
/* Директива #include используется для подключения других
файлов. Она берет подключаемый файл и его содержимое
воспринимается так, как будто бы оно написано там,
где находится директива. #include используется для загрузки
"стандартных заголовочных файлов" (которые позволяют вызывать
функции С, такие как "printf()") -- Когда подключается стандартный
файл, имя файла помещают в угловые скобки (например <stdio.h>) --
Директива #include также используется чтобы подключить "заголовочные
файлы, определяемые пользователем". Имена этих файлов помещают
в кавычки (например "main.h")
*/
#define NUM 1
// Директива #define используется в оснавном для подстановок
// Прежде чем .c файл будет скомпилирован, препроцессор
// заменит все встречающиеся в тексте "NUM" на "1"
// Как вы только что видели, #define использовалась для "целочисленных подстановок".
// Также ее можно использовать для символьных (текстовых) подстановок. И вновь, ДО
// компиляции файла с программой, препроцессор заменит все "TEXT", которые он найдет
// на "preprocessor directives"
#define TEXT "preprocessor directives"
// **Примечание** Это были только ДВА примера, как можно использовать #define для замен
int main()
{
// Обратите внимание на подстановки, которые делаются в этих выражениях
// Напечатать "NUM" на экран
printf("%d\n",NUM);
// Напечатать "TEXT" на экран
printf("%s\n\n",TEXT);
/******************** #if, #else, и #endif ***************************/
/**********************************************************************/
#if NUM
/* Директива #if работает именно так, как вы ожидали - ДО того, как
файл с программой будет скомпилирован, проверяется условие - если
оно истинно (т.е. не равно нулю), ВЕСЬ код между #if и #else
компилируется -- Если оно ложно (т.е. равно нулю), код между #if и #else
НЕ будет скомпилирован (как будто бы его стерли). */
printf("NUM is non-zero\n"); // ("NUM не равно нулю")
#else
// Если выражение "#if NUM" ложно, будет компилироваться код между #else и #endif
// Если выражение "#if NUM" истинно, код между #else и #endif НЕ будет
// скомпилирован.
printf("NUM is zero\n"); // ("NUM равно нулю")
#endif
/* Для каждого #if вы должны иметь соответствующий #endif -- выражения #if могут быть вложенными
Например вы можете написать:
#if УСЛОВИЕ
// Код
#if ДРУГОЕ_УСЛОВИЕ
// Еще код
#endif
#endif
Можно использовать #if для быстрого "комментирования" большого куска программы
Просто напишите:
#if 0
// Большой кусок программы
#endif
Когда вы будете компилировать, ВЕСЬ код между #if и #endif НЕ будет компилироваться
*/
return 0; // Выход из main()
} // Конец main()
/*
Есть еще одна часто используемая директива -- Вы увидите ее в начале "заголовочных файлов,
определяемых пользователем", это директива препроцессора #ifndef.
Следующая директива #ifndef вычисляется в значение "истинно"
#ifndef 0
Если идентификатор (ноль в примере выше) НЕ ОПРЕДЕЛЕН, условие истинно (не равно нулю).
В другом случае, условие ложно (равно нулю).
Предположим, что мы сделали заголовочный файл "main.h". Очень часто заголовочные файлы
начинаются так:
#ifndef MAIN_H
#define MAIN_H
// Содержимое заголовочного файла
#endif
Это делается для предотвращения "переопределения множественных заголовочных файлов" в
проекте -- Таким способом у нас может быть много файлов .c, которые включают директивой
#include тот же самый заголовочный файл без конфликтов.
А теперь обещанный список директив препроцессора:
#define
#elif
#else
#endif
#error
#if
#ifdef
#ifndef
#import
#include
#line
#pragma
#undef
Пока ваш уровень программирования не станет по крайней мере средним, вам не нужно волноваться
по поводу директив, отличных от тех, которые мы обсудили (и даже будучи начинающим программистом
вы вероятно будете на первых порах использовать только #include и #define)
*/
// www.GameTutorials.com -- ©2001
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
|