2015-02-16 7 views
5

के साथ अपरिभाषित यह पहली बार पॉज़िक्स के साथ काम कर रहा है; मैंने शामिल किया:S_IFMT और S_IFREG -std = c11 या -std = gnu11

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

और मेरे पास यह स्निपेट है।

error: ‘S_ISFMT’ undeclared (first use in this function) 

:

stat(pathname, &sb); 
if ((sb.st_mode & S_IFMT) == S_IFREG) { 
    /* Handle regular file */ 
} 

लेकिन Gentoo पर जीसीसी 4.8.3 का उपयोग कर अगर मैं साथ -std = c99 या -std = C11 या -std = gnu99 या -std = gnu11 संकलित मैं यह त्रुटि आई अगर मैं omit -std = * मुझे कोई त्रुटि नहीं मिली है। लेकिन मुझे -std = c99 की सभी सुविधाएं भी चाहिए (जैसे कीवर्ड प्रतिबंधित या (int i ;;) आदि ...) मैं अपना कोड कैसे संकलित कर सकता हूं?

+0

यह थोड़ा अजीब है। क्या आप कृपया एक न्यूनतम आत्मनिर्भर उदाहरण बना सकते हैं ताकि मैं इस प्रणाली को अपने सिस्टम पर पुन: उत्पन्न कर सकूं? मैं इसे अन्यथा पुन: उत्पन्न करने में सक्षम नहीं था। – fuz

उत्तर

5

आधुनिक पॉज़िक्स-अनुपालन प्रणालियों को S_IFMT और S_IFREG मान प्रदान करने की आवश्यकता है। POSIX का एकमात्र संस्करण जिसे इसकी आवश्यकता नहीं है (और वास्तव में, इसे रोकता है) POSIX.1-1990 है, जो आपकी मशीन पर मानक प्रतीत होता है।

किसी भी मामले में, प्रत्येक POSIX- अनुपालन प्रणाली macros प्रदान करती है जो आपको फ़ाइल के प्रकार की जांच करने की अनुमति देती है। ये मैक्रोज़ मास्किंग विधि के बराबर हैं।

तो आपके मामले में, (sb.st_mode & S_IFMT) == S_IFREG के बजाय, बस S_ISREG(sb.st_mode) लिखें।

+0

यह प्रश्न का उत्तर नहीं देता है '__S_IFMT' और '__S_IFREG' आंतरिक स्थिरांक हैं जिनका उपयोग किसी उपयोगकर्ता प्रोग्राम द्वारा कभी नहीं किया जाना चाहिए। इसके अलावा, ओपी पॉज़िक्स के बारे में पूछता है और आप एक मंच-विशिष्ट गैर-उत्तर देते हैं। – fuz

+0

@FUZxxl मेरे उत्तर का पहला भाग * करता है * प्रश्न का उत्तर देता है, मेरे उत्तर का दूसरा भाग केवल उस मामले के लिए है जहां ओपी वास्तव में मास्किंग करने पर जोरदार (और अनावश्यक) है। –

+0

@FUZxxl OP आंतरिक स्थिरांक के संख्यात्मक मूल्य भी ले सकता है और केवल उन्हें अपने प्रोग्राम में उपयोग कर सकता है, लेकिन यह केवल अनावश्यक है क्योंकि POSIX सिस्टम मैक्रोज़ जो आपके लिए मास्किंग करते हैं (जैसा कि मेरे गैर-प्लेटफ़ॉर्म-विशिष्ट उत्तर में बताया गया है)। –

1

रखो या तो #define _BSD_SOURCE या #define _XOPEN_SOURCE किसी भी #include अपने स्रोत कोड में से पहले। यह देखने के लिए कि यह क्यों काम करता है, से ऊपर sys/stat.h में, फिर feature_test_macros(7) मैन पेज में देखें।

संबंधित मुद्दे