Где 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.