打印函数指针的便携方式?

Portable way to print function pointers?

我想知道这是否是打印函数指针的可移植方式。
将函数指针直接转换为 unsigned char * 是不可移植的。

/* writehex() prints the given byte as its hex representation to the given FILE * */
extern void writehex(FILE *, const unsigned char);

/* Theoretical printf() implementation. */
int printf(const char *format, ...) {

    ...

    void (*fptr)(void);
    const unsigned char *bytes = (const unsigned char *) &fptr;
    size_t i;

    fptr = va_arg(ap, ((void)(*)(void)));
    for (i = 0; i < sizeof(fptr); ++i)
        writehex(stdout, *bytes++);

    ...
}

将函数指针转换为 void * 或将其他指针转换为 对象 可能会丢失信息,因为函数指针可能更宽。

没有可移植打印函数指针的好方法 - C 的缺点。

备选方案:

转换为宽整数

尝试最宽的。

if (sizeof function_pointer <= sizeof(uintmax_t)) {
  printf("0x%jX\n", (uintmax_t) function_pointer);
}

内存转储(OP的做法)

请注意,填充和字节顺序问题正在发挥作用。输出可能包括额外的垃圾和未例外的订单,但这将始终“有效”,因为它是可移植和兼容的。

“将函数指针直接转换为 unsigned char * 是 non-portable。”不适用于此处,因为可以将函数指针的 地址 转换为 void *

else {
  unsigned char buf[sizeof(function_pointer)];
  memcpy(buf, &function_pointer, sizeof buf);
  printf("0x");
  for (unsigned i=0; i<sizeof buf; i++) {
    printf("%02X", buf[i]);
  }
  printf("\n");
}

  printf("0x");
  for (unsigned i = 0; i

  printf("0x%jX\n", (uintmax_t) function_pointer);
}
  

考虑到更广泛的体系结构,打印函数指针的文本输出在不同的实现中有非常不同的解释。