Где stdarg.h?
В моей системе (Mac OS 10.6)/usr/include/stdarg.h есть:
/* This file is public domain. */
/* GCC uses its own copy of this header */
#if defined(__GNUC__)
#include_next <stdarg.h>
#elif defined(__MWERKS__)
#include "mw_stdarg.h"
#else
#error "This header only supports __MWERKS__."
#endif
Итак, если GCC использует свою собственную копию stdarg.h, где это? Я понятия не имею, что
что #include_next
означает (возможно, расширение GCC?), или что-то вроде
"MWERKS" (компилятор?).
Ответы
Ответ 1
<stdarg.h>
, даже больше, чем большинство заголовков библиотеки C, имеет тенденцию быть очень специфичным для компилятора. Таким образом, каждый из компиляторов в OS X имеет собственную реализацию stdarg.h
, найденную в определенном для компилятора месте (которое включено как часть путей поиска по умолчанию для этого компилятора). Компилятор находит общий stdarg.h
, который в основном говорит ему "продолжать искать" (через расширение #include_next
), а затем находит реализацию, специфичную для компилятора.
__MWERKS__
ссылается на старый компилятор для PPC, "MetroWerks CodeWarrior".
Ответ 2
#include_next
- расширение gcc. Как вы знаете, #include
имеет список путей, которые он ищет для файлов заголовков. #include_next
указывает препроцессору включить указанный заголовок, проверяющий только пути в списке после того, который содержит текущий файл заголовка.
__MWERKS__
- это макрос препроцессора, определенный в старых версиях CodeWarrior.