Эмпирически оба из следующих компонентов компилируются и нормально работают на GCC 6.4:
#include <stdio.h>
int main(void) {
#ifdef __GLIBC__
puts("__GLIBC__");
#endif
return 0;
}
и
int main(void) {
#ifdef __GLIBC__
puts("__GLIBC__");
#endif
return 0;
}
но, конечно, только первый выводит результат.
Это должно означать, что __GLIBC__
происходит от stdio.h
, который должен включать features.h
, см. Также: Какова цель заголовка features.h?
Следовательно, строго говоря, __GLIBC__
сам по себе не является четким указанием на то, что используется glibc, поскольку даже без заголовков GCC уже встраивает объекты времени выполнения, такие как crt1.o
, в исполняемый файл финала и те из Глибц.
Итак, основной отсутствующий вопрос: гарантирует ли glibc включение features.h
в каждый заголовок? Я не мог найти ясную цитату документации. TODO.