Я не впечатлен кодом, который использует '#include <linux/stat.h>
' вместо '#include <sys/stat.h>
'. Я также не впечатлен кодом, в котором файл version.h содержит:
-e #define VERSION "1.5-3"
(Этот файл генерируется командой - 'echo -e '#define...' > version.h
'. Тьфу!)
Если вы измените функцию с:
inline int hashed(const char*s)
{
int returnval=atoi(s);
if(returnval>2) returnval=2;
if(returnval<0) returnval=0;
return returnval;
}
до:
static
inline int hashed(const char*s)
{
int returnval=atoi(s);
if(returnval>2) returnval=2;
if(returnval<0) returnval=0;
return returnval;
}
(и исправьте другие проблемы, упомянутые выше), затем он компилируется на MacOS X 10.6.2 с GCC
«i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc., сборка 5646) (точка 1)».
Тестовый код не выполняется в случайных точках, так как он предполагает касание в / bin / touch (в MacOS X это / usr / bin / touch). Есть также много предупреждений о «спецификаторах типов, игнорируемых в возвращаемом типе функции», так как «auto.h» определяет 4 функции как возвращающие «const int» (для различных типов «int»), а также в указателях функций в структуре в тот же заголовок.
Полагаю, это сводится к недостаточному опыту со стороны авторов - или к недостаточному количеству протестированных платформ. Команде version.h не нужно использовать вкладку (я считаю, что '-e
' - это расширение нотации '\t
' в командной строке - Makefile должен быть исправлен, чтобы пропустить '-e
' и замените '\t
' на простой пробел.
Поведение 'inline
' в стандартном C99 интересно:
6.7.4 Спецификаторы функций
Синтаксис
функция спецификатор:
inline
Ограничения
Спецификаторы функций должны использоваться только в объявлении идентификатора функции.
Встроенное определение функции с внешней связью не должно содержать определения
изменяемый объект со статической продолжительностью хранения и не должен содержать ссылку на
идентификатор с внутренней связью.
В размещенной среде спецификатор встроенной функции не должен появляться в объявлении
основной.
Семантика
Функция, объявленная со спецификатором встроенной функции, является встроенной функцией.
спецификатор функции может появляться более одного раза; поведение такое же, как если бы оно появилось
только однажды. Создание функции как встроенной функции предполагает, что вызовы этой функции
как можно быстрее. 118) Степень эффективности таких предложений
реализации. 119)
Любая функция с внутренней связью может быть встроенной функцией. Для функции с внешним
связи, применяются следующие ограничения: если функция объявлена со встроенным
спецификатор функции, то он также должен быть определен в той же единице перевода. Если все
декларации области файла для функции в модуле перевода включают встроенную функцию
спецификатор без extern, то определение в этой единице перевода является встроенным
определение. Встроенное определение не предоставляет внешнего определения для функции,
и не запрещает внешнее определение в другой единице перевода. Встроенное определение
предоставляет альтернативу внешнему определению, которое переводчик может использовать для реализации
любой вызов функции в том же модуле перевода. Не определено, является ли звонок
Функция использует встроенное определение или внешнее определение. 120)
118) Используя, например, альтернативу обычному механизму вызова функции, такую как ‘‘ inline
замена»». Встроенная замена не является текстовой заменой и не создает новую функцию.
Поэтому, например, расширение макроса, используемого в теле функции, использует
определение, которое он имел в том месте, где появляется тело функции, а не там, где вызывается функция; а также
идентификаторы ссылаются на объявления в области видимости тела. Аналогично, функция имеет
один адрес, независимо от количества встроенных определений, которые встречаются в дополнение к внешнему
определение.
119) Например, реализация может никогда не выполнять встроенную замену или может выполнять только встроенную
замены вызовов в области действия встроенной декларации.
120) Поскольку встроенное определение отличается от соответствующего внешнего определения и от любого другого
соответствующие встроенные определения в других единицах перевода, все соответствующие объекты со статическим хранилищем
продолжительность также различна в каждом из определений.