Hoffentlich ist dies eher eine einfache C++ - Frage (nicht eine Sprache-Anwalt).dladdr: pointer-to-function vs pointer-to-object
Wie soll man die GNU-Erweiterung dladdr
in C++ verwenden? Normalerweise würde man die folgenden in C schreiben:
#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;
}
jedoch Klirren verwendet, kann man die Besetzung sehen ungültig sein kann:
$ 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.
Die Warnung erscheint mir legitim, so ist es eine Möglichkeit, um zu arbeiten Das ?
Nein, das ist eine allgemeine Einschränkung der "dl" API. Es verpackt Funktionszeiger in void-Zeiger in einer Weise, die nicht vom C-Standard garantiert wird, aber Posix benötigt void-Zeiger, um Funktionszeiger halten zu können (und die "dl" -Funktionen sind Teil von Posix). –
Besser, es so zu schreiben: 'void * p;/* dl ... */* reinterpret_cast (& where_am_i) = p; ' –
Nur um sicher zu gehen: Wir reden hier über C++ code, C++ 14 ich würde raten? –