我需要打印已存储在函数指针中的函数名称。
例如。
preValidateScriptHookFunc = (srvScrGenFuncPtrType)SRV_VerifyPymtOrderMaintDtls_validate_data;
我希望通过preValidateScriptHookFunc在程序运行期间输出值“SRV_VerifyPymtOrderMaintDtls_validate_data”。
preValidateScriptHookFunc是一个函数指针,可以存储任何函数名。 请告诉我printf或fprintf中应使用哪种格式说明符。
答案 0 :(得分:2)
通常无法做到这一点 - 请参阅http://c-faq.com/misc/symtab.html。
答案 1 :(得分:0)
我担心没有使用调试信息api(这取决于你的平台)或者使用某种聪明的技巧将指针注册到查找表中是不可能的。
答案 2 :(得分:0)
根据您的编译器,您可能可以使用预定义的宏。
http://msdn.microsoft.com/en-us/library/b0084kay(VS.71).aspx
答案 3 :(得分:0)
作为Ofir says in his answer,你基本上不能这样做。这些函数的名称仅在链接完成之前存在(它们可能在调试数据之后持续存在)。链接后它只是指针。
如果您愿意将功能地址存储在某处并与之进行比较,您可以这样做:
$ 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;
}
$ gcc 3922500.c
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.
$ ./a.out
name: gets name: (unknown)