मैं विभिन्न कंपाइलरों के माध्यम से निम्नलिखित कोड चला रहा हूं:
int main()
{
float **a;
void **b;
b = a;
}
मैं जो इकट्ठा करने में सक्षम था, void **
वह जेनेरिक पॉइंटर नहीं है , जिसका अर्थ है कि दूसरे पॉइंटर से किसी भी रूपांतरण को कम से कम चेतावनी नहीं देनी चाहिए। हालाँकि, यहाँ मेरे परिणाम हैं (सभी विंडोज पर किए गए हैं):
- gcc - जैसा कि अपेक्षित है, एक चेतावनी फेंकता है।
- g ++ - एक त्रुटि फेंकता है, जैसा कि अपेक्षित था (यह C ++ की सही अनुमेय टाइपिंग के कारण है?)
- MSVC (cl.exe) - निर्दिष्ट / दीवार के साथ भी, कोई चेतावनी नहीं फेंकता है।
मेरा सवाल है: क्या मैं पूरी चीज़ के बारे में कुछ याद कर रहा हूं और क्या कोई विशेष कारण है कि एमएसवीसी चेतावनी नहीं देता है? MSVC से चेतावनी देते समय उत्पादन करता है । void **
float **
नोट की एक और बात: यदि मैं a = b
स्पष्ट रूपांतरण से प्रतिस्थापित करता हूं a = (void **)b
, तो कोई भी संकलक चेतावनी नहीं देता है। मैंने सोचा कि यह एक अमान्य कलाकार होना चाहिए, इसलिए कोई चेतावनी क्यों नहीं होगी?
मैं यह प्रश्न पूछ रहा हूं क्योंकि मैं CUDA सीखना शुरू कर रहा था और आधिकारिक प्रोग्रामिंग गाइड ( https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device.ememory ) निम्नलिखित कोड पाया जा सकता है:
// Allocate vectors in device memory
float* d_A;
cudaMalloc(&d_A, size);
के प्रकार के पहले तर्क के रूप में, के void **
लिए एक अंतर्निहित रूपांतरण करना चाहिए । इसी तरह का कोड सभी प्रलेखन में पाया जा सकता है। क्या यह सिर्फ NVIDIA के अंत पर मैला काम है या मैं फिर से, कुछ याद कर रहा हूं? चूंकि MSVC का उपयोग करता है, कोड चेतावनी के बिना संकलित करता है।&d_A
cudaMalloc
void **
nvcc
void**
जेनेरिक पॉइंटर नहीं है। केवल void*
है
(void**)
एक स्पष्ट सी शैली कास्ट है। यह संकलक से कहता है कि आप जो कर रहे हैं उस पर बारीकी से गौर न करें और आप पर भरोसा करें। यह प्रकार की सुरक्षा प्रणाली का एक स्पष्ट ओवरराइड है और मूल रूप से किसी भी प्रकार के रूपांतरण को स्वीकार करने के लिए कंपाइलर्स की आवश्यकता होती है। सी स्टाइल कास्ट से बचा जाना चाहिए, वे वैसे भी शक्तिशाली हैं। C ++ कास्ट्स का उपयोग करें जैसे static_cast
कि अगर आप कुछ ऐसा करने की कोशिश कर रहे हैं जो शिकायत नहीं करेगा।