उम्मीद है कि यह एक साधारण सी ++ प्रश्न है (भाषा-वकील नहीं)।dladdr: पॉइंटर-टू-फ़ंक्शन बनाम पॉइंटर-टू-ऑब्जेक्ट
सी ++ में जीएनयू एक्सटेंशन dladdr
का उपयोग कैसे किया जाता है? आम तौर पर एक सी में निम्नलिखित लिखना होगा:
#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;
}
हालांकि बजना का उपयोग कर एक को देखने के कलाकारों अमान्य हो सकता है कर सकते हैं:
$ 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.
चेतावनी मेरे लिए वैध लगता है, इसलिए वहाँ के आसपास काम करने के लिए एक रास्ता है उस ?
नहीं, यह "डीएल" एपीआई की सामान्य सीमा है। यह पैकेज पॉइंटर्स को शून्य पॉइंटर्स में इस तरह से काम करता है कि सी मानक द्वारा काम करने की गारंटी नहीं है, लेकिन पॉज़िक्स को फ़ॉइंट पॉइंटर्स (और "डीएल" फ़ंक्शन पॉज़िक्स का हिस्सा हैं) रखने के लिए शून्य पॉइंटर्स की आवश्यकता होती है। –
इसे लिखने के लिए बेहतर: 'शून्य * पी;/* डीएल ... */* reinterpret_cast (और where_am_i) = पी; ' –
बस यह सुनिश्चित करने के लिए: हम यहां सी ++ कोड के बारे में बात कर रहे हैं, सी ++ 14 मुझे लगता है? –