【问题标题】:Print the name of function assigned to a function pointer打印分配给函数指针的函数名称
【发布时间】:2010-10-13 09:59:26
【问题描述】:

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

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

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

【问题讨论】:

标签: c


【解决方案1】:

这通常是不可能的 - 请参阅 http://c-faq.com/misc/symtab.html

【讨论】:

  • 我同意。并非在所有情况下都是可能的。如果它是一个指针,那么在运行时你不会知道它指向什么,并且在运行时编译器会省略名称。
  • 我试图在 GDB 中打印它,它给了我正确的名称。所以不应该也可以通过 printf 吗??
  • GDB 可以访问的信息比您的程序可以访问的更多信息 - 列表/调试信息。
  • 所以间接地我也无法在 printf 或 fprintf 中获得函数的名称??
  • 有间接方式(如其他答案中所述)。
【解决方案2】:

恐怕如果不使用调试信息 api(取决于您所在的平台)或使用某种巧妙的技巧在查找表中注册指针,这是不可能的。

【讨论】:

    【解决方案3】:

    根据您的编译器,您也许可以使用预定义的宏。

    http://msdn.microsoft.com/en-us/library/b0084kay(VS.71).aspx

    【讨论】:

      【解决方案4】:

      作为 Ofir says in his answer,您基本上不能这样做。函数的名称仅在链接完成之前存在(它们可能会在之后的调试数据中持续存在)。链接后它只是指针。

      如果您愿意将函数地址存储在某处并与它们进行比较,您可以这样做:

      $ 猫 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:在函数“主”中: 3922500.c:12:警告:分配来自不兼容的指针类型 3922500.c:13:警告:分配来自不兼容的指针类型 /tmp/ccvg8QvD.o:在函数“fxname”中: 3922500.c:(.text+0x1d): 警告:“gets”功能很危险,不应使用。

      $ ./a.out

      名称:得到 姓名:(未知)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        相关资源
        最近更新 更多