Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印分配给函数指针的函数名_C - Fatal编程技术网

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中的函数名??有间接的方法(如其他答案中所述)。可能重复