【发布时间】:2019-08-06 05:21:48
【问题描述】:
我正在尝试编写一个函数,该函数传递一个用于分配的函数作为其参数;它应该接受void *(*)(size_t) 类型的任何有效分配器。但是,当我尝试使用 alloca 作为分配器时,我遇到了奇怪的行为 - 构造一个指向 alloca 函数的函数指针可以正常编译,但会导致链接器错误:
#include <stdlib.h>
#include <alloca.h>
int main() {
void *(*foo)(size_t) = alloca;
}
结果
/tmp/cc8F67yC.o: In function `main':
test15.c:(.text+0x8): undefined reference to `alloca'
collect2: error: ld returned 1 exit status
这是否与 alloca 内联有关?但是当函数不需要地址时,内联不会仅作为优化来完成。事实上,使用 GCC,我什至可以编写自己的版本,并在上述代码中按预期工作:
static inline void *alloca(size_t n) {
return __builtin_alloca(n);
}
标准版本的行为方式不同是有原因的吗?
【问题讨论】:
-
可能是因为编译器直接将
alloca的所有调用替换为__builtin_alloca? -
alloca并不是一个真正的函数。它是一个内置的编译器,由具有无限智慧和睿智的人赋予了类似函数的语法。您自己的版本在上述代码中按预期工作,但可惜它根本不像alloca那样工作。如果你给它一个__attribute__((always_inline)),函数本身可能在gcc中工作,但函数的地址不会。
标签: c function-pointers alloca