Umarım bu basit bir C++ sorusudur (bir dil avukatı değil).dladdr: işaretçi-işleçle işaretçi-nesne-nesne
Nasıl bir C++ GNU uzantısı dladdr
kullanmak gerekiyordu? Tipik bir C aşağıdaki yazarsınız:
#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;
}
biri dökme geçersiz olabilir görebilirsiniz clang kullanarak:
$ 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.
uyarı böylece geçici bir çözüm için bir yol var, bana meşru görünüyor bu mu
Hayır, bu "dl" API'sinin genel bir sınırlamasıdır. Fonksiyon işaretleyicilerini, C standardıyla çalışmayı garanti etmeyecek şekilde boşluk işaretçilerine paketler, ancak Posix, fonksiyon göstergelerini (ve "dl" fonksiyonlarının Posix'in bir parçası) tutabilmesi için boşluk göstergelerini gerektirir. –
Böyle yazmak daha iyidir: void * p;/* dl ... */* reinterpret_cast (& where_am_i) = p; ' –
Sadece emin olmak için: C++ kodundan bahsediyoruz, C++ 14 Tahmin ediyorum? –