निम्न पंक्ति (शुद्ध ग) खिड़कियों पर सफाई से संकलित (Win7 64 बिट + 13 + mingw32 codeblocks) और डेबियन (खरखरा 32 बिट + codeblocks 10 + जीसीसी), लेकिन काली (64 बिट्स पर चेतावनी को जन्म देती है + कोडब्लॉक्स + जीसीसी)। कोई टिप्पणी? मेरा मतलब है, मुझे यह चेतावनी क्यों मिलती है, हालांकि एक ही पंक्ति विंडोज़ & डेबियन पर किसी भी चेतावनी को संकलित करती है?मुझे "विभिन्न आकार के पूर्णांक में पॉइंटर से कास्ट" त्रुटि क्यों मिलती है?
void* foo(void *dst, ...) {
// some code
unsigned int blkLen = sizeof(int); // this line ok.
unsigned int offset = (unsigned int) dst % blkLen; // warning here!
// some code cont...
}
codeblocks में संदेश है: "त्रुटि: विभिन्न आकार [-Werror = सूचक करने वाली पूर्णांक-कास्ट] के पूर्णांक के लिए सूचक से डाली"
ध्यान दें: मेरी संकलक विकल्प -std=c99 -Werror -save-temps
हैं (सभी तीन प्रणालियों पर समान)।
संपादित 2: हालांकि मैं यह संकलित किया है करने के लिए w/ओ नीचे पूर्वप्रक्रमक लाइनों का उपयोग कर चेतावनी, @Keith थॉम्पसन (नीचे देखें) मुद्दे के बारे में एक महत्वपूर्ण बिंदु है प्रबंधित किया है। तो, मेरा अंतिम निर्णय uintptr_t
का उपयोग करना बेहतर विकल्प होगा।
संपादित करें 1: सभी के लिए धन्यवाद उत्तर दिया। जैसा कि सभी उत्तरों नोट करते हैं, समस्या 64 बिट्स बनाम 64 बिट्स समस्या है। मैं निम्नलिखित पूर्वप्रक्रमक लाइनों डाला है:
#if __linux__ // or #if __GNUC__
#if __x86_64__ || __ppc64__
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
#else
#if _WIN32
#define ENVIRONMENT32
#else
#define ENVIRONMENT64
#endif
#endif // __linux__
#ifdef ENVIRONMENT64
#define MAX_BLOCK_SIZE unsigned long long int
#else
#define MAX_BLOCK_SIZE unsigned long int
#endif // ENVIRONMENT64
और उसके बाद के रूप में समस्या लाइन की जगह:
unsigned int offset = (MAX_BLOCK_SIZE) dst % blkLen;
अब, सब कुछ ठीक लगता है।
कुछ सिस्टम/कंपाइलर्स पर, एक int का आकार सूचक के आकार से अलग होता है। हालांकि, एक ठेठ प्रणाली के लिए, ऑफ़सेट का मूल्य 0 ... 3 होगा। तो मॉड्यूलो के हस्ताक्षर किए गए int के परिणाम का थोड़ा सा कास्टिंग समस्या को ठीक करेगा। – user3629249