打印分配给功能指针的功能名称

时间:2010-10-13 09:59:27

标签: c

我需要打印已存储在函数指针中的函数名称。 例如。 preValidateScriptHookFunc = (srvScrGenFuncPtrType)SRV_VerifyPymtOrderMaintDtls_validate_data;

我希望通过preValidateScriptHookFunc在程序运行期间输出值“SRV_VerifyPymtOrderMaintDtls_validate_data”。

preValidateScriptHookFunc是一个函数指针,可以存储任何函数名。 请告诉我printf或fprintf中应使用哪种格式说明符。

4 个答案:

答案 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)