2010-10-13 106 views
2

我需要打印已存儲在函數指針中的函數的名稱。例如, preValidateScriptHookFunc = (srvScrGenFuncPtrType)SRV_VerifyPymtOrderMaintDtls_validate_data;打印分配給函數指針的函數名稱

我想通過preValidateScriptHookFunc在程序運行期間輸出值「SRV_VerifyPymtOrderMaintDtls_validate_data」作爲輸出。

preValidateScriptHookFunc是一個函數指針,它可以存儲任何函數名。 請讓我知道應在printf或fprintf中使用哪種格式說明符。

+0

可能的重複[如何從C函數的指針獲取函數的名稱](http://stackoverflow.com/questions/351134/how-to-get-functions-name-from-functions-pointer-in-c) – Mundi 2012-08-25 07:33:04

回答

2

這通常是不可能的 - 見http://c-faq.com/misc/symtab.html

+0

我同意。在任何情況下都不可能。如果它是一個指針,那麼在運行時你不會知道它指向什麼,並且在運行時,編譯器會忽略名稱。 – none 2010-10-13 10:15:45

+0

我試圖在GDB中打印這個,它給了我正確的名字。所以是不是應該可以通過printf呢? – rajneesh 2010-10-13 10:19:09

+0

GDB可以訪問比程序可以訪問的信息更多的信息 - 列表/調試信息。 – Ofir 2010-10-13 11:26:52

0

恐怕沒有使用調試信息api(這取決於你的平臺),或者使用某種巧妙的技巧將指針註冊到查找表中,這是不可能的。

0

由於奧菲爾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: 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)