2012-11-03 89 views
7

我在尋找聲明extern「C」函數指針的類型。它是一個成員變量。 this question中的語法我無法編譯。如何將成員聲明爲指向extern「C」函數的指針?

template<typename Sig> struct extern_c_fp { 
    extern "C" typedef typename std::add_pointer<Sig>::type func_ptr_type; 
}; 

我已經嘗試放置extern "C"兩端,並typedeftypenametypefunc_ptr_type之間,但是編譯器之間拒絕了所有。有什麼建議麼?

+0

使用'extern「C」'別名模板,這將工作。 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1463 –

+2

順便說一句,你需要'Sig'作爲'extern'C''。指向函數類型的指針不包含鏈接。這是函數類型本身。在形成函數類型時引發鏈接。不是在命名現有函數類型時 - 現有類型具有鏈接。 –

+0

http://liveworkspace.org/code/768027ef00bb0a31e76d8d856ac50801它抱怨少,但仍然存在問題。 – Puppy

回答

1
extern "C" { 
    template<typename R, typename... Args> 
    using extern_c_fp = R(*)(Args...); 
} 

using my_function_ptr = extern_c_fp<void, int, double>; 
// returns void, takes int and double 

這不會使用相同的接口使用,但也有可能是一種方法來提取返回類型和參數類型的Sig

這工作在鐺3.1。 Xeo指出it didn’t work in GCC。我不確定這是否是編譯器中的錯誤,所以在使用這個時要小心。

0

你不能聲明這樣的一個typedef(從7.5p4):

甲聯動說明書應僅在命名空間範圍(3.3)發生。