2012-09-19 14 views
12

में परिभाषित सी ++ आकार_टी कहां है, अब मैं टाइप किए गए कीवर्ड का उपयोग कर प्रोग्रामर द्वारा नई प्रकार की परिभाषा के बारे में बात कर रहा हूं। जब तक मेरे विद्यार्थियों का आकार size_t (उदाहरण के लिए funciton लंबाई()) का उपयोग करके किया जाता है, जिसके लिए मुझे उन्हें "विश्वास" करने के लिए थोड़ा प्रयास करना पड़ता था, यह एक पूर्णांक प्रकार है, मुझे लगता है कि यह बहुत अच्छा होगा उन प्रकार को दिखाएं जहां इस प्रकार को परिभाषित किया गया है।लिनक्स

तो, मैं एक बहुत किया है ग्रेप के दशक में/usr/शामिल एक ubuntu बॉक्स में, और क्या मुझे लगता है कि size_t है, बारी में, बारी में size_type जो की एक नई परिभाषा metadata_type की एक परिभाषा है, और है कि इस निर्देशिका में अंत। अंतिम "typedef unsigned int metadata_type;" नहीं मिला।

/usr/src में मैं anohter पिछले प्रकार yy_size_t कहा जाता है, मिल गया है ...

लेकिन, किसी भी मामले में मैं असमर्थ रहे हैं श्रृंखला के अंत करने के लिए मिलता है।

क्या किसी को यह पता करने के लिए अंतिम परिभाषा कहां मिलनी है कि यह एक हस्ताक्षरित int (या जैसा) है? क्या मुझे अपने बॉक्स में एक विकास पैकेज याद आ सकता है? इस मामले में, मैं size_t प्रकार का उपयोग कर प्रोग्राम संकलित क्यों कर सकता हूं?

+0

एक रिकर्सिव grep आज़माएं: "grep -r" – Brady

+0

[dd :: size_t बनाम size_t बनाम std :: ____ :: size_type] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/8507851/stdsize-t- बनाम-आकार-टी-बनाम-एसडीडी-आकार-प्रकार) – trojanfoe

+0

@ ब्रैडी: 'sudo apt-get इंस्टॉल करें ack-grep' –

उत्तर

21

आप विस्तार करने के लिए मानक सी प्रीप्रोसेसर (cpp) हाथ से साथ फ़ाइलों को शामिल कोशिश करते हैं और इस बात का उत्पादन देख सकते हैं:

$ echo '#include <stdlib.h>' | cpp -I/usr/include - > stdlib-expanded.c 

आप पाएंगे कि cpp के उत्पादन में भी इंगित करने के लिए मार्कर भी शामिल है जहाँ से stdlib-expanded.c में कोड शामिल किया गया है।

+2

+1 बस 'echo' # शामिल करें '| सीपीपी-आई/यूएसआर/शामिल | grep size_t' 'typedef long unsigned int size_t देता है; 'आपकी सहायता के लिए पहली पंक्ति – stijn

+0

धन्यवाद –

+0

echo' # शामिल '| सीपीपी-आई/यूएसआर/शामिल | grep size_t चाल छिपाया। धन्यवाद! – user2548100

3

जैसा कि अन्य ने लिखा था, यदि आप सभी शामिल फ़ाइलों को खोजते हैं तो शायद आप इसे पा सकते हैं। हालांकि तथ्य यह है कि इस तरह के अधिकांश कार्यान्वयन की गारंटी नहीं है।

मानक कहता है कि, उदाहरण के लिए, #include <stddef.h> को size_t की परिभाषा प्रदान करनी चाहिए जो एक हस्ताक्षरित पूर्णांक प्रकार होना चाहिए। लेकिन यह भी कहता है कि फ़ाइल सिस्टम पर कहीं भी मौजूद होने के लिए stddef.h नामक फ़ाइल की आवश्यकता नहीं है। और यहां तक ​​कि एक कार्यान्वयन है कि इस तरह के एक फ़ाइल लेकिन उस फ़ाइल प्रदान करता है केवल निम्न पंक्ति

#pragma stdlib_stddef_h 

पूरी तरह से अनुरूप हो सकता है अगर ऊपर pragma प्रभावी रूप से प्रदान करता है क्या मानक है कि शीर्ष लेख के लिए निर्धारित करता है शामिल हैं।

दूसरे शब्दों में, size_t एक हस्ताक्षरित पूर्णांक प्रकार है क्योंकि मानक यही कहता है, ऐसा नहीं है क्योंकि आप हेडर फ़ाइल में पढ़ सकते हैं।

3

बस पूर्णता के लिए, क्या आपने बस सी ++ को size_t से पूछने पर विचार किया है?

#include <iostream> 
#include <cstddef> 
#include <limits> 

int main() 
{ 
    std::cout << "sizeof(size_t) = " << sizeof(std::size_t) << std::endl; 
    std::cout << "is size_t an integer? " << 
     (std::numeric_limits<std::size_t>::is_integer ? "yes" : "no") 
     << std::endl; 
    std::cout << "is size_t signed? " << 
     (std::numeric_limits<std::size_t>::is_signed ? "yes" : "no") 
     << std::endl; 
} 

मुझे देता है

sizeof(size_t) = 8 
is size_t an integer? yes 
is size_t signed? no 
5

जीसीसी हेडर के कुछ प्रदान करता है और यहां प्रासंगिक है: size_tstddef.h जो उन हेडर में से एक है में परिभाषित किया गया है। यहां उदाहरण के लिए /usr/lib/x86_64-redhat-linux/4.1.1/include/stddef.h पर है।वहाँ size_t की परिभाषा

typedef __SIZE_TYPE__ size_t; 

__SIZE_TYPE__ एक संकलक पूर्वनिर्धारित मैक्रो (जो यह सुनिश्चित करें कि संकलक और हैडर सहमत हैं और क्या संकलक उम्मीद अपने तर्कों पर निर्भर के रूप में अनुमति देता है, है - -m32 साथ उदाहरण के लिए यह एक हस्ताक्षरित 32 बिट बिट्स है, और -64 के साथ एक 64 हस्ताक्षर किए गए 64 बिट प्रकार - कंपाइलर तर्कों से हेडर स्वतंत्र होने के लिए)।