ソフトウェアの「独立した」コンポーネントが相互に対話したい場合、インターフェースを定義することから逃れることはできません。この場合、コンポーネントmain.cpp
、B.cpp
およびを定義することにしましC.cpp
た。main()
が を呼び出すFOO()
にはB.cpp
、C++ 言語の型規則により、最初にプロトタイプが存在する必要があります。これは、少なくとも 2 つの有用な目的に役立ちます。これにより、コンパイラは、コンパイル時に関数に正しい引数が渡されていることを静的にチェックできます。また、関数の引数を効率的に管理するのに十分な情報をコンパイラに提供します (たとえば、スタックとレジスタ)。ほとんどの場合、インターフェイスはヘッダー ファイルで定義されるため、自然に使用できるはずです。
動的インターフェースを使用してソフトウェアが開発されることがあります。この場合、呼び出される関数は実行時に決定されます。、dlopen
、dlsym
およびdlclose
呼び出しを使用して、これを実現できます。簡単な例は次のとおりです。
// main.cpp
int main () {
void *dh = dlopen(0, RTLD_LAZY);
void (*B_FOO_PTR)(void)
= *static_cast<void (**)(void)>(dlsym(dh, "B_FOO_PTR"));
dlcose(dh);
B_FOO_PTR();
}
// B.cpp
static void FOO () {
void *dh = dlopen(0, RTLD_LAZY);
void (*C_FOO_PTR)(int, double)
= *static_cast<void (**)(int, double)>(dlsym(dh, "C_FOO_PTR"));
dlcose(dh);
C_FOO_PTR(0, 1.0);
}
extern "C" { void (*B_FOO_PTR)(void) = &FOO; }
// C.cpp
static void FOO (int, double) {
//...
}
extern "C" { void (*C_FOO_PTR)(int, double) = &FOO; }