C++ では、関数ポインターはタイプ セーフです。それらを壊すには、とてつもなくばかげたことをしなければなりません (通常、キャスト、共用memcpy
体、または同様のものを使用します。偶然に起こることはありません)。
ただし、C では、関数の型はそれほど厳密ではありません。次のようなことができます。
int add(int a, int b){ return a + b; }
int add_f(float a, float b){ return a + b; }
int (*f)(); // empty argument list does NOT mean zero arguments.
// for zero arguments, say int (*)(void)
f = &add;
f = &add_f;
http://ideone.com/Y6mCc
私は見事に愚かな例を求められました。 ここに行きます:
#include <iostream>
int add(int a, int b){ return a + b; }
int add_f(float a, float b){ return a + b; }
union {
int (*f1)(int, int);
int (*f2)(float, float);
} fp;
int main(void)
{
fp.f1 = &add;
std::cout << "Expected (1): " << add(1, 3) << std::endl;
std::cout << "Actual (1): " << (fp.f1)(1, 3) << std::endl;
std::cout << "Expected (2): " << add(1.0f, 3.0f) << std::endl;
std::cout << "Actual (2): " << (fp.f2)(1.0f, 3.0f) << std::endl;
fp.f2 = &add_f;
std::cout << "Expected (3): " << add_f(1.0f, 3.0f) << std::endl;
std::cout << "Actual (3): " << (fp.f2)(1.0f, 3.0f) << std::endl;
std::cout << "Expected (4): " << add_f(1, 3) << std::endl;
std::cout << "Actual (4): " << (fp.f1)(1, 3) << std::endl;
return 0;
}
このばかげたことは、C# でも同様に可能であることに注意してくださいMarshal.Copy
。