2012-06-17 9 views
48

मैं एक सी ++ सॉफ्टवेयर पैकेज है कि 2007 में लिखा गया था संकलित करने के लिए कोशिश कर रहा हूँ और मैं इस त्रुटि मिल रही है नाम नहीं बताती:'uint32_t' एक प्रकार

error: ‘uint32_t’ does not name a type

इस में हो रहा है 64-बिट उबंटू जी ++ 4.5.2 का उपयोग कर। यह जी ++ 4.1.2 का उपयोग कर 64-बिट CentOS पर ठीक संकलित करता है।

वहाँ एक #include या एक संकलक झंडा है कि मैं याद कर रहा हूँ है? या, मैं typedef का प्रयोग कर एक size_t या शायद एक unsigned int को uint32_t आवंटित करने के लिए करना चाहिए?

+5

stdint.h या शीर्षलेखों को शामिल करें। उस प्रकार (जैसा कि मैं इसे समझता हूं) सी 99 का हिस्सा है लेकिन इसे सी ++ में नहीं बनाया है। –

+3

क्या आपने #'शामिल किया था? 64 बिट उबंटू पर एक संभावित बग की तरह लग रहा है। साथ ही, क्या आपके पास gcc के लिए '-std = C++ 98' या कुछ ऐसे कमांड लाइन विकल्प हैं? यदि हां, तो क्या आप जांच सकते हैं कि क्या यह ठीक है यदि आप '-std = gnu ++ 98' का उपयोग करते हैं? – dirkgently

+0

@dirkgently मैंने मेकफ़ाइल की जांच की और कोई 'std' विकल्प नहीं थे। – rmtheis

उत्तर

102

आप stdint.h

#include <stdint.h> 
+36

"उचित" सी ++ हेडर 'cstdint' होगा। – paxdiablo

+0

नोट, मेरे मामले में समस्या वास्तव में थी कि' बूस्ट/cstdint.hpp' शामिल नहीं था। 'yum इंस्टॉल बूस्ट-डेवेल 'मेरे मामले को ठीक कर दिया। – snooze92

+0

@paxdiablo cstdint.h को बाहरी "सी" {} ब्लॉक के अंदर शामिल नहीं किया जाना चाहिए? – StarShine

27

आप #include <cstdint> करने की जरूरत है, लेकिन यह हमेशा काम नहीं हो सकता है।

समस्या यह है कि कुछ संकलक अक्सर स्वचालित रूप से विभिन्न हेडर में परिभाषित या उससे पहले इस तरह के मानकों स्थान पर थे प्रकार प्रदान नामों का निर्यात है।

अब, मैंने कहा "हमेशा काम नहीं कर सकता।" ऐसा इसलिए है क्योंकि cstdint हेडर सी ++ 11 मानक का हिस्सा है और यह हमेशा मौजूदा सी ++ कंपाइलर्स पर उपलब्ध नहीं है (लेकिन अक्सर होता है)। Stdint.h शीर्षलेख सी समकक्ष है और सी 99 का हिस्सा है।

सबसे अच्छा पोर्टेबिलिटी के लिए, मैं, बूस्ट के boost/cstdint.hpp हैडर उपयोग करने की अनुशंसा करता है, तो आप को बढ़ावा देने का उपयोग करने को तैयार हैं चाहते हैं। अन्यथा, आप संभवतया # शामिल '<cstdint> से दूर हो पाएंगे।

+0

इसने मुझे '#error दिया है इस फ़ाइल को आने वाले आईएसओ सी ++ मानक, सी ++ 0x के लिए कंपाइलर और लाइब्रेरी समर्थन की आवश्यकता है। यह समर्थन वर्तमान में प्रयोगात्मक है, और -std = C++ 0x या -std = gnu ++ 0x कंपाइलर विकल्पों के साथ सक्षम होना चाहिए। – rmtheis

+1

ठीक है, जैसा कि यह कहता है, cstdint नए सी ++ मानक का हिस्सा है (जिसे कहा जाता था सी ++ 0x लेकिन आधिकारिक तौर पर, सी ++ 11 नहीं है। इसलिए उस हेडर का उपयोग करने के लिए, आपको g ++ में नया मानक सक्षम करना होगा। जैसा कि मैंने कहा था, इन प्रकारों को प्राप्त करने का सबसे अच्छा पोर्टेबल तरीका बूस्ट या किसी अन्य का उपयोग करना है कंपाइलर समर्थन पर भरोसा करने के बजाय समकक्ष हेडर। – plasma

4

अन्य उत्तर मानते हैं कि आपकी संकलक सी ++ 11 अनुरूप है शामिल करने के लिए की जरूरत है। यह ठीक है अगर यह है। लेकिन क्या होगा यदि आप पुराने कंपाइलर का उपयोग कर रहे हैं?

मैं नेट पर कहीं निम्नलिखित हैक उठाया। यह मेरे लिए काफी अच्छी तरह से काम करता है:

#if defined __UINT32_MAX__ or UINT32_MAX 
    #include <inttypes.h> 
    #else 
    typedef unsigned char uint8_t; 
    typedef unsigned short uint16_t; 
    typedef unsigned long uint32_t; 
    typedef unsigned long long uint64_t; 
    #endif 

यह निश्चित रूप से, पोर्टेबल नहीं है। लेकिन यह आपके कंपाइलर के लिए काम कर सकता है।

1

base.mk फ़ाइल में निम्न जोड़ें। निम्नलिखित 3 लाइन #Error इस फ़ाइल में आगामी आईएसओ सी ++ मानक, C++ 0x के लिए संकलक और पुस्तकालय समर्थन की आवश्यकता है से बचने के लिए महत्वपूर्ण -include $(TOP)/defs.mk

CFLAGS=$(DEBUG) -Wall -W -Wwrite-strings 
CFLAGS_C=-Wmissing-prototypes 
CFLAGS_CXX=-std=c++0x 
LDFLAGS= 
LIBS= 

है। यह समर्थन वर्तमान में प्रयोगात्मक है, और -std = C++ 0x या -std = gnu ++ 0x कंपाइलर विकल्प

+0

सवाल यह नहीं कहता कि मेक का उपयोग किया जा रहा है या नहीं। एक और पोर्टेबल उत्तर बस कहेंगे जो कंपाइलर को पास करने के लिए झंडे (और आप कौन सा कंपाइलर हैं ssuming)। –

8

के साथ सक्षम होना चाहिए I मैक ओएसएक्स 10.6.8 पर भी एक ही समस्या का सामना करना पड़ा और दुर्भाग्यवश #include <stdint.h> या इसी फ़ाइल में <cstdint.h> ने मेरी समस्या का समाधान नहीं किया। हालांकि, अधिक खोज के बाद, मुझे यह समाधान #include <sys/types.h> जोड़ने की सलाह देता है जो मेरे लिए अच्छा काम करता है!

1

यदि यह तब हुआ जब आप opencv शीर्षलेख शामिल करते हैं।

मैं अनुशंसा करता हूं कि हेडर के क्रम को बदल दें।

मानक सी ++ हेडर के नीचे ओपनसीवी हेडर डालें।

इस तरह:

#include<iostream> 
#include<opencv2/core/core.hpp> 
#include<opencv2/highgui/highgui.hpp> 
1

मैं था ही एक lib मैं इंटरनेट से डाउनलोड संकलित करने के लिए कोशिश कर समस्या थी। मेरे मामले में, कोड में पहले से ही #include <cstdint> था। मैंने इसे हल किया:

using std::uint32_t; 
+0

@Daniel आपको इस प्रकार तक पहुंचने से पहले सही हेडर को अभी भी शामिल करना होगा। – cubrr

+0

हां, '# शामिल' की आवश्यकता है। मैंने नहीं कहा कि यह नहीं है। लेकिन चूंकि मेरे मामले में यह '# शामिल 'था, और वहां' नेमस्पेस std' का उपयोग नहीं किया गया था, संकलक 'uint32_t' नाम को हल करने में सक्षम नहीं था। इसलिए यही कारण है कि मुझे 'std :: uint32_t;' का उपयोग करना था – Daniel

0

आधार.एमके फ़ाइल में निम्न जोड़ें। निम्नलिखित 3 पंक्ति महत्वपूर्ण है - $ (टॉप) /defs.mk

CXXFLAGS = -g -std=c++11 -O3 -W -Wall -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long $(THREADSCXXFLAGS) 
संबंधित मुद्दे