2011-03-01 62 views
0

我有2個庫。庫A在C中編譯。庫B在C++中編譯,但主要是C代碼。傳遞函數指針不工作

我需要調用庫中的以下功能:

foo* c_func(int64_t (*ptr_to_func)(void)); 

這個功能做的第一件事是:

if(!ptr_to_func) 
    return NULL; 

的ptr_to_func需要指向庫B中的函數,它是聲明爲:

int64_t bar(void); 

我有一個cpp文件,其主函數調用另一個函數n,在那裏我做以下幾點:

foo* f = c_func(bar); 

然後我檢查f是否爲空。它是。

我在做什麼錯?

+0

我不明白這個問題。 'foo'是一個類型,而不是一個變量。 'c_func(bar)'的結果是基於'c_func'的;你沒有提供它的定義。它可能工作,但由於某種原因返回NULL。 – 2011-03-01 03:41:19

+0

@Jeremiah推測OP的意思是'f'被選中,而不是'foo'。 – 2011-03-01 03:48:24

+0

@Jim是的,那是我的意圖。對困惑感到抱歉。它已被糾正。 – anio 2011-03-01 03:49:45

回答

4

你在做什麼似乎是正確的,但要注意你的函數bar()應該在extern "C" {部分中聲明。

c_func()由於其他原因可能返回NULL。在調試器中遍歷它並查看(在c_func()的開頭處設置斷點)。

+0

如果包含功能欄的頭文件也包含ifdef __cplusplus,我還需要extern嗎? – anio 2011-03-01 03:53:27

+0

@anio:函數本身不應該包含在頭文件中 - 只有它的聲明。如果您將該函數編譯爲C++,則聲明和定義都應該在'extern「C」{}'內。 '#ifdef __cplusplus'用於允許你編譯與C相同的文件,但你已經說過你正在編譯該庫爲C++,所以這可能是不相關的。 – caf 2011-03-01 04:21:53