История изменений
Исправление
Moisha_Liberman,
(текущая версия)
:
Вот не надо мешать в одно месиво alloca и __builtin_alloca. Там в glibc напару с gcc такая хитрая магия на препроцессоре и макросах (включая для асма) напару с недокументированными (не соответствующими документации) хаками, что неизвестно что во что раскрывается и под каким именем потом будет связываться-линковаться.
Я выше приводил заголовочник alloc.h, где для случая GNUC явно раскрывается как __builtin_alloca().
По документации _builtin* - это неполноценные функции и в коде их можно вызвать только как функции. Но как видно для __builtin_alloca это не так, и почему сделана такая лазейка - можно только догадываться.
А тут и гадать особо нечего. Функция «как бы есть». Т.е., в сам по себе стандарт С она не включена (прямо же сказано – «This function is not in POSIX.1.»), но она есть и довольно широко применяется на практике. Поэтому её реализацию оставили на компиляторе, а в /usr/include/alloca.h чётко сказали:
/* Allocate a block that will be freed when the calling function exits. */
extern void *alloca (size_t __size) __THROW;
#ifdef __GNUC__
# define alloca(size) __builtin_alloca (size)
#endif /* GCC. */
Т.е., для случая GNUC реализацию предоставит компилятор, а для остальных случаев берите где хотите (где сможете). Причём, «предоставит компилятор» под ту архитектуру, под которую собираем код. Если под интел, то под интел, если под ARM, то под ARM, т.к. здесь не оговрена единая универсальная реализация и всё может очень сильно зависеть от платформы.
В массе своей внутренняя кухня gcc стандартному пользователю-программисту на фиг двести лет подряд не сдалась, поэтому остальные функции этого семейства __builtin*, даже связанные с __builtin_alloca* по логике в простанство программиста не выводятся, выведена только __builtin_alloca() и всё.
Когда (и если!) alloca() занесут в стандарт, то она плавно перекочует скорее всего имено в стандартную системную либу. Но будет это или нет, это одному Господу и комитету по стандартизации С известно.
Исправление
Moisha_Liberman,
:
Вот не надо мешать в одно месиво alloca и __builtin_alloca. Там в glibc напару с gcc такая хитрая магия на препроцессоре и макросах (включая для асма) напару с недокументированными (не соответствующими документации) хаками, что неизвестно что во что раскрывается и под каким именем потом будет связываться-линковаться.
Я выше приводил заголовочник alloc.h, где для случая GNUC явно раскрывается как __builtin_alloca().
По документации _builtin* - это неполноценные функции и в коде их можно вызвать только как функции. Но как видно для __builtin_alloca это не так, и почему сделана такая лазейка - можно только догадываться.
А тут и гадать особо нечего. Функция «как бы есть». Т.е., в сам по себе стандарт С она не включена (прямо же сказано – «This function is not in POSIX.1.»), но она есть и довольно широко применяется на практике. Поэтому её реализацию оставили на компиляторе, а в /usr/include/alloca.h чётко сказали:
/* Allocate a block that will be freed when the calling function exits. */
extern void *alloca (size_t __size) __THROW;
#ifdef __GNUC__
# define alloca(size) __builtin_alloca (size)
#endif /* GCC. */
Т.е., для случая GNUC реализацию предоставит компилятор, а для остальных случаев берите где хотите (где сможете). Причём, «предоставит компилятор» под ту архитектуру, под которую собираем код. Если под интел, то под интел, если под ARM, то под ARM, т.к. здесь не оговрена единая универсальная реализация и всё может очень сильно зависеть от платформы.
В массе своей внутренняя кухня gcc стандартному пользователю-программисту на фиг двести лет подряд не сдалась, поэтому остальные функции этого семейства __builtin*, даже связанные с __builtin_alloca* по логике в простанство программиста не выводятся, выведена только __builtin_alloca() и всё.
Когда (и если!) alloca() занесут в стандарт, то она плавно перекочует скорее всего имено в стандартную системную либу. Но будет это или нет, это односу Господу и комитету по стандартизации С известно.
Исходная версия
Moisha_Liberman,
:
А вот тут не совсем согласен. ;)
Вот не надо мешать в одно месиво alloca и __builtin_alloca. Там в glibc напару с gcc такая хитрая магия на препроцессоре и макросах (включая для асма) напару с недокументированными (не соответствующими документации) хаками, что неизвестно что во что раскрывается и под каким именем потом будет связываться-линковаться.
Я выше приводил заголовочник alloc.h, где для случая GNUC явно раскрывается как __builtin_alloca().
По документации _builtin* - это неполноценные функции и в коде их можно вызвать только как функции. Но как видно для __builtin_alloca это не так, и почему сделана такая лазейка - можно только догадываться.
А тут и гадать особо нечего. Функция «как бы есть». Т.е., в сам по себе стандарт С она не включена (прямо же сказано – «This function is not in POSIX.1.»), но она есть и довольно широко применяется на практике. Поэтому её реализацию оставили на компиляторе, а в /usr/include/alloca.h чётко сказали:
/* Allocate a block that will be freed when the calling function exits. */
extern void *alloca (size_t __size) __THROW;
#ifdef __GNUC__
# define alloca(size) __builtin_alloca (size)
#endif /* GCC. */
Т.е., для случая GNUC реализацию предоставит компилятор, а для остальных случаев берите где хотите (где сможете). Причём, «предоставит компилятор» под ту архитектуру, под которую собираем код. Если под интел, то под интел, если под ARM, то под ARM, т.к. здесь не оговрена единая универсальная реализация и всё может очень сильно зависеть от платформы.
В массе своей внутренняя кухня gcc стандартному пользователю-программисту на фиг двести лет подряд не сдалась, поэтому остальные функции этого семейства __builtin*, даже связанные с __builtin_alloca* по логике в простанство программиста не выводятся, выведена только __builtin_alloca() и всё.