任意の関数を安全に指すことができる関数ポインタを宣言するにはどうすればよいですか?
void
ポインタのようなものが必要ですが、関数用です。単純にそれを使用することを考えましたが、この質問への回答によると、少なくとも非POSIXシステムでは、関数ポインターをデータポインターに確実に変換することはできません。
私はこれのいくつかの可能な例を検索して見つけました:
WindowsにはFARPROCがあります:
int (FAR WINAPI * FARPROC) ()
ドキュメントにもこれが記載されています:
Cでは、FARPROC宣言は、パラメーターリストが指定されていないコールバック関数を示します。
うまく聞こえますが、戻り値はどうですか?として明確に指定されてい
int
ます。OpenGLの仕様の1つは次のとおりです。
typedef void (*GLfunction)(); extern GLfunction glXGetProcAddressARB(const GLubyte *procName);
パラメータリストも指定されていませんが、リターンタイプは明確に指定されてい
void
ます。
これをどう解釈するかわかりません。関数ポインターは、使用される前に、適切なプロトタイプを使用して関数ポインター型にキャストされます。例えば:
typedef void (*function_pointer_t)();
extern function_pointer_t get_function(const char * name);
/* Somewhere else... */
typedef double (*cosine_function_t)(double);
cosine_function_t cosine = (cosine_function_t) get_function("cos");
このコードは安全ですか?それはC標準に違反していますか、それとも未定義の動作を引き起こしますか?