C语言如何定义指向endian.h中be32toh()的函数指针?
问题原因
be32toh 这类字节序转换接口在绝大多数glibc/BSD的endian.h实现中,并不是真实的导出函数,而是预处理宏。宏会在编译的预处理阶段直接展开为对应的内置运算或底层函数调用,宏名本身不会作为标识符保留到编译阶段,自然无法直接对其取地址赋值给函数指针,也就会抛出undeclared的编译错误。你可以执行gcc -E test.c查看预处理后的代码,就能看到be32toh已经被替换为了具体的表达式,没有保留原标识符。
修复方案
你可以手动封装一层对应的静态包装函数,把宏的调用封装到函数内部,再将函数指针指向这个包装函数即可,示例修改后的代码如下:
#include <stdint.h> #include <endian.h> // 手动封装be32toh的包装函数 static uint32_t wrap_be32toh(uint32_t val) { return be32toh(val); } int addInt(int n, int m) { return n+m; } int main(){ int (*functionPtr)(int,int); functionPtr = addInt; uint32_t (*newptr)(uint32_t); // 指向封装后的函数即可 newptr = wrap_be32toh; return 0; }
如果需要适配htobe32、be16toh等其他同类接口,按照相同逻辑封装对应签名的包装函数即可,该方案可以兼容所有平台的endian.h实现。
内容的提问来源于stack exchange,提问作者milad
相关产品推荐
相关产品推荐

