加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

构造一个指向alloca的函数指针会导致链接器错误?

发布时间:2020-12-16 10:38:02 所属栏目:百科 来源:网络整理
导读:我试图写一个函数,传递一个函数用于分配作为其参数;它应该接受任何类型为void *(*)(size_t)的有效分配器.但是,当我尝试使用alloca作为分配器时,我遇到了奇怪的行为 – 构建一个指向alloca函数的函数指针编译得很好,但会导致链接器错误: #include stdlib.h#i
我试图写一个函数,传递一个函数用于分配作为其参数;它应该接受任何类型为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);
}

有没有理由说标准版本的行为方式不一样?

解决方法

引用 here的手册页:

The fact that the code is inlined means that it is impossible to take
the address of this function,or to change its behavior by linking
with a different library.

该页面还提到:

messy consequences if one has a private version of this function

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读