我让gcc
使用编译下面的例子-Wall -pedantic
:
#include <stdio.h>
int main(void)
{
printf("main: %p\n", main); /* line 5 */
printf("main: %p\n", (void*) main); /* line 6 */
return 0;
}
我得到:
main.c:5: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘int (*)()’
main.c:6: warning: ISO C forbids conversion of function pointer to object pointer type
5号线使我改变了这样的代码在第6行。
我错过删除警告打印功能的地址是什么时候?
这主要是打印函数指针的唯一可移植的方法。
size_t i;
int (*ptr_to_main)() = main;
for (i=0; i<sizeof ptr_to_main; i++)
printf("%.2x", ((unsigned char *)&ptr_to_main)[i]);
putchar('\n');
当一个函数指针转换为void指针在技术上是危险的,转换函数指针空指针在POSIX标准使用,所以它几乎是一定要上的大多数编译器工作。
查找dlsym()
这是正确的,在该警告:ISO C不允许一个函数指针转换为一个对象的指针类型,其中包括void*
。 又见这个问题 。
你根本无法在便携方式打印函数的地址,让你无法摆脱的警告。
您可以使用@R打印功能指针..的建议。
这整个想法的确是不可移植的,因为有些系统使用不同大小的指针代码和数据。
你真正需要的是一个函数指针有多大是特定于平台的知识,并强制转换为一个整数类型的大小。 不幸的是,我不认为任何人有标准化的intfuncptr_t
analagous到intptr_t
它可以保存任何数据指针。
正如R.指出在他的回答 ,您可以随时处理指针数组(可能是signed
或unsigned
) char
,这样你就不需要任何整型正确的尺寸。