Кажется, существует большая путаница в отношении препроцессора.
Что делает компилятор, когда видит #include
, что он заменяет эту строку содержимым включенных файлов, без вопросов.
Итак, если у вас есть файл a.h
с таким содержимым:
typedef int my_number;
и файл b.c
с таким содержанием:
#include "a.h"
#include "a.h"
файл b.c
будет преобразован препроцессором перед компиляцией в
typedef int my_number;
typedef int my_number;
что приведет к ошибке компилятора, поскольку тип my_number
определен дважды. Несмотря на то, что определение такое же, это не допускается языком C.
Поскольку заголовок часто используется более чем в одном месте, include guards обычно используются в C. Это выглядит так:
#ifndef _a_h_included_
#define _a_h_included_
typedef int my_number;
#endif
Файл b.c
по-прежнему будет содержать все содержимое заголовка дважды после предварительной обработки. Но второй экземпляр будет проигнорирован, поскольку макрос _a_h_included_
уже был бы определен.
Это действительно хорошо работает, но имеет два недостатка. Прежде всего, должны быть написаны включаемые охранники, а имя макроса должно отличаться в каждом заголовке. А во-вторых, компилятору еще нужно искать файл заголовка и читать его так часто, как он включен.
Objective-C имеет инструкцию препроцессора #import
(ее также можно использовать для кода C и C ++ с некоторыми компиляторами и параметрами). Это почти то же самое, что и #include
, но также внутренне отмечает, какой файл уже был включен. Строка #import
заменяется содержимым указанного файла только при первом обнаружении. Каждый раз после этого просто игнорируется.
person
Sven
schedule
17.09.2010