POSIXでは、関数ポインタ から void * への変換は認められているのでしょうか?
背景
void *
と関数ポインタとの相互変換は、ISO/IEC 9899 や ISO/IEC 14882 では未定義となっています (広く使われている言語拡張の例として挙げられてはいますが) が、そのままでは POSIX のdlsym()
が使い物にならなくなるため、dlsym()
の解説に以下のような注釈が付けられ、void*
から関数ポインタへの変換が認められています。
IEEE Std 1003.1, 2013 Edition の dlsym()
の解説より引用:
Note that conversion from a void * pointer to a function pointer as in:
fptr = (int (*)(int))dlsym(handle, "my_function");
is not defined by the ISO C standard. This standard requires this conversion to work correctly on conforming implementations.
質問
そこで気になったのですが、逆方向の変換、即ち関数ポインタから void *
への変換は認められているのでしょうか。
私が IEEE Std 1003.1 を調べた範囲内ではそのような記述を見付けられなかったのですが、見落しかもしれないと思い、質問させて頂きました。
関数ポインタをvoid *
に変換することは、Linux上でプログラミングをするにあたり、今までちょくちょくやっていたのですが、もしPOSIXで認められていければ避けるようにしようかと考えています。