これはむしろ単純なC++の質問です(言語弁護士ではない)。dladdr:ポインタへのポインタ対オブジェクトへのポインタ
C++でGNU拡張dladdr
をどのように使用するのですか?通常、1はCに次のように記述します。
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <dlfcn.h>
static void where_am_i() {}
int main()
{
Dl_info info;
dladdr((void*)&where_am_i, &info);
return 0;
}
1は、キャストが無効である可能性が見ることができる打ち鳴らすを使用して:
$ clang --version
Debian clang version 3.6.2-3 (tags/RELEASE_362/final) (based on LLVM 3.6.2)
Target: x86_64-pc-linux-gnu
Thread model: posix
$ clang -Wpedantic -o foo foo.cpp -ldl
foo.cpp:11:11: warning: cast between pointer-to-function and pointer-to-object is an extension [-Wpedantic]
dladdr((void*)&where_am_i, &info);
^~~~~~~~~~~~~~~~~~
1 warning generated.
警告はそう回避する方法があり、私には合法的なようですそれ ?
いいえ、それは "dl" APIの一般的な制限です。 C言語で動作することが保証されていない方法で、関数ポインタをvoidポインタにパッケージ化しますが、Posixは関数ポインタを保持できるようにvoidポインタを必要とします( "dl"関数はPosixの一部です)。 –
このように書く方が良い: 'void * p;/* dl ... */* reinterpret_cast(&where_am_i)= p; ' –
私たちはここでC++コードについて話しています。 –