मैं कोड निम्नलिखित है:जीसीसी क्यों चेतावनी नहीं देता है जब एक enum या int मान को फ़ंक्शन के तर्क के रूप में पारित किया जाता है जो बूल है?
typedef enum
{
FOO,
BAR,
BAZ
} foo_t;
static void afunc(bool is_it_on)
{
/* do the job */
}
int main(void)
{
afunc(BAZ);
return 0;
}
इस कोड संकलन भी -Wall -Wextra
विकल्पों संकलक करने के लिए दिया के साथ किसी भी चेतावनी संदेश उत्पन्न नहीं करता है,। मैंने -Wconversion
विकल्प के साथ भी कोशिश की है, जिसने कोई प्रभाव नहीं लिया क्योंकि bool
और enum
g ++ के लिए समान आकार का प्रतीत होता था। (enum
का आकार विनिर्देश में परिभाषित नहीं किया गया है, जहां तक मुझे पता है)
मैंने जीसीसी मैनुअल के माध्यम से कॉम्बेड किया है और इसके बारे में कुछ भी नहीं मिला है।
सवाल:
- वहाँ इस तरह के मामलों में एक चेतावनी उत्पन्न करने के लिए संकलक मजबूर करने के लिए एक तरीका है?
- या यह है कि यह अंतर्निहित कास्टिंग सी ++ विनिर्देश द्वारा कानूनी है?
संकलक है कि मैं उपयोग कर रहा हूँ: जीसीसी 4.1.2
उसे संपादित
निष्कर्ष:
इसका एकमात्र व्यवहार्य समाधान का प्रतिनिधित्व करने के लिए एक नए प्रकार परिभाषित करने के लिए लगता है 0 या 1, और bool
के बजाय इसका उपयोग करें।
कोड निम्नलिखित की तरह होगा, और जी ++ जैसे रूपांतरण के बारे में शिकायत:
typedef enum
{
FOO1,
FOO2
} foo_t;
typedef enum
{
MY_FALSE,
MY_TRUE
} my_bool_t;
void foo(my_bool_t a)
{
}
int main(void)
{
/*
* gcc generates an error.
* error: cannot convert ‘foo_t’ to ‘my_bool_t’
* for argument ‘1’ to ‘void foo(my_bool_t)’
*/
foo(FOO1);
return 0;
}
क्योंकि सी ++ ' टाइप सिस्टम केवल उपयोगकर्ता द्वारा परिभाषित प्रकारों के लिए अच्छा है, अंतर्निहित प्रकारों के लिए यह हमेशा बेकार है। इसकी विरासत का परिणाम। –
हां ऐसा लगता है।मैंने केवल 0 या 1 का प्रतिनिधित्व करने के लिए समर्पित एक नया प्रकार टाइप करने का निर्णय लिया है, और _true_ या _false_ को व्यक्त करने के उद्देश्य से बूल के बजाय इसका उपयोग करें। – orchistro