C 打印分配给函数指针的函数名
我需要打印已经存储在函数指针中的函数名。 如。C 打印分配给函数指针的函数名,c,C,我需要打印已经存储在函数指针中的函数名。 如。 preValidateScriptHookFunc=(srvScrGenFuncPtrType)SRV_VerifyPymtOrderMaintDtls_validate_数据 我希望值“SRV_VerifyPymtOrderMaintDtls_validate_data”作为通过preValidateScriptHookFunc运行程序期间的输出 preValidateScriptHookFunc是一个函数指针,可以存储任何函数名。 请让我知道在
preValidateScriptHookFunc=(srvScrGenFuncPtrType)SRV_VerifyPymtOrderMaintDtls_validate_数据代码>
我希望值“SRV_VerifyPymtOrderMaintDtls_validate_data”作为通过preValidateScriptHookFunc运行程序期间的输出
preValidateScriptHookFunc是一个函数指针,可以存储任何函数名。
请让我知道在printf或fprintf中应该使用哪种格式说明符 这通常是不可能的-请参阅。如果不使用调试信息api(取决于您所在的平台)或使用某种巧妙的技巧在查找表中注册指针,恐怕就不可能了。根据您的编译器,您可能可以使用预定义的宏
作为一名工程师,您基本上无法做到这一点。函数的名称仅在链接完成之前存在(它们可能在调试数据之后存在)。链接之后,它只是指针
如果您愿意将函数地址存储在某个位置并与之进行比较,您可以这样做:
$cat 3922500.c
#include <stdio.h>
char *fxname(void *fx) {
if (fx == fprintf) return "fprintf";
if (fx == gets) return "gets";
if (fx == scanf) return "scanf";
return "(unknown)";
}
int main(void) {
void (*fx)(void);
fx = gets; printf("name: %s\n", fxname(fx));
fx = putchar; printf("name: %s\n", fxname(fx));
return 0;
}
3922500.c: In function 'main':
3922500.c:12: warning: assignment from incompatible pointer type
3922500.c:13: warning: assignment from incompatible pointer type
/tmp/ccvg8QvD.o: In function `fxname':
3922500.c:(.text+0x1d): warning: the `gets' function is dangerous and should not be used.
#包括
char*fxname(void*fx){
如果(fx==fprintf)返回“fprintf”;
如果(fx==get)返回“get”;
如果(fx==scanf)返回“scanf”;
返回“(未知)”;
}
内部主(空){
无效(*fx)(无效);
fx=gets;printf(“名称:%s\n”,fxname(fx));
fx=putchar;printf(“名称:%s\n”,fxname(fx));
返回0;
}
gcc 3922500.c美元
#include <stdio.h>
char *fxname(void *fx) {
if (fx == fprintf) return "fprintf";
if (fx == gets) return "gets";
if (fx == scanf) return "scanf";
return "(unknown)";
}
int main(void) {
void (*fx)(void);
fx = gets; printf("name: %s\n", fxname(fx));
fx = putchar; printf("name: %s\n", fxname(fx));
return 0;
}
3922500.c: In function 'main':
3922500.c:12: warning: assignment from incompatible pointer type
3922500.c:13: warning: assignment from incompatible pointer type
/tmp/ccvg8QvD.o: In function `fxname':
3922500.c:(.text+0x1d): warning: the `gets' function is dangerous and should not be used.
3922500.c:在函数“main”中:
3922500.c:12:警告:来自不兼容指针类型的赋值
3922500.c:13:警告:来自不兼容指针类型的赋值
/tmp/ccvg8QvD.o:在函数“fxname”中:
3922500.c:(.text+0x1d):警告:“get”函数很危险,不应使用。
美元/年
name: gets
name: (unknown)
姓名:gets
姓名:(不详)
我同意。在所有情况下都不可能。如果它是一个指针,那么在运行时之前您不会知道它指向什么,并且在运行时编译器会忽略名称。那么,通过printf是否也应该是可能的呢?GDB可以访问比您的程序可以访问的更多的信息-列表/调试信息。因此,间接地,我也无法获得printf或fprintf中的函数名??有间接的方法(如其他答案中所述)。可能重复