打印函数指针的便携方式?
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);
}
考虑到更广泛的体系结构,打印函数指针的文本输出在不同的实现中有非常不同的解释。
我想知道这是否是打印函数指针的可移植方式。
将函数指针直接转换为 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);
}
考虑到更广泛的体系结构,打印函数指针的文本输出在不同的实现中有非常不同的解释。