「C」言語リンケージを使用する関数を取る1つの引数へのポインタのテンプレートに、公開typedef
を追加します。テンプレート内にextern- "C" -function型をtypedefすることは可能ですか?
私が試した:
extern "C" {
template <typename return_t_, typename arg1_t_>
struct test
{
typedef return_t_ (*C_fun1_t)(arg1_t_);
};
}
そして:
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" {
typedef return_t_ (*C_fun1_t)(arg1_t_);
}
};
そして:
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" typedef return_t_ (*C_fun1_t)(arg1_t_);
};
を成功せず。
私は可能なことを達成しようとしていますか?
これは、extern "C"が別の呼び出し規約を使用するかもしれないものではありません。あなたが考慮しなければならない厄介なことの1つですが、ほとんど起こりません。 'extern" C "'は型システムの一部ではないので、関数ポインタ型は2つを区別しません。これはリンケージ指定子です。つまり、C++ *から作られたポインタを通る呼び出しは、ポインタの参照が 'extern" C "'であるかどうかにかかわらず動作します。これは失敗した可能性のあるCからの呼び出しですが、型システムはこれをチェックしません。 –
@ Steve:それは型システムの一部です。 C++ 03§7.5p1: "異なる言語リンケージを持つ2つの関数型は、それ以外の点で同じであっても、異なる型です。" §5.2.2p1: "関数型が呼び出された関数の定義の関数型の言語リンケージとは異なる言語リンケージを持つ式を介して関数を呼び出すことは定義されていません。" –
@Fred:ああ、OK。申し訳ありませんが、間違った情報をどこから選んだのか分かりません。また、関数ポインタをパラメータとしてとるextern "C"関数を宣言すると、 "C"関数または "C++"関数が使用されますか? g ++はうれしく '-pedantic'のどちらかを使うことができます。 –