2010-08-28 51 views
3

是否有任何方法可以對字符串進行unstringify作爲宏參數?我需要能夠調用名稱是字符串的函數。像這樣:C使用宏進行Unstringification

void hello() { 
    printf("Hello, world!"); 
} 

call_func("hello"); 

我該如何實現call_func。它將在#include d的模塊中,並將用於調用主c文件中的函數。如果有另外一種方法可以做到這一點,名字不一定要在字符串中,但可以作爲參數傳遞給一個可以正常使用的函數。這就是我的意思:

#define call_func(X) X() 
void do_something(Some_kind_of_C_func_type i) { 
    call_func(i) 
} 
void hello() { 
    printf("Hello, world!"); 
} 

do_something(C_FUNC(hello)); 

回答

1

好吧,我看到兩種方法來做到這一點,這取決於你的目標是什麼。

首先是函數指針;基本上把一個功能看作是一個變量。有關快速概覽,請參閱here

或者,您可以以共享庫的方式構建想要調用的代碼,然後使用類似dlopen()或LoadLibrary()的方法打開該庫,然後使用任一接口訪問變量/函數。

+0

函數指針正是我想要的!謝謝。 – None 2010-08-28 20:41:59

0

雖然不完全清楚你想完成什麼,但不能使用宏來獲取在運行時輸入的字符串並解析相同名稱的函數。你可以做的是,將所有函數註冊到一個列表(或者稍微複雜的數據結構)中,並用他們的名字來調用它們。

#define INSERT(fn) addfn(#fn, &fn) 
void addfn(char const* name, func_t fp); 

addfn coult按照發行指針,並把它在字典中的條目name下。

+0

在適當的句柄上使用['dlsym()'](http://www.opengroup.org/onlinepubs/9699919799/functions/dlsym.html)將會起作用。我相信你需要使用['dlopen(0,0)'](http://www.opengroup.org/onlinepubs/9699919799/functions/dlopen.html)來獲得合適的句柄。但是你的基本觀點 - 你無法簡單地做到這一點(無論是使用宏還是其他技術)都是有效的。 – 2010-08-28 23:58:19