2015-09-17 8 views
5

संक्षिप्त विवरण:हैडर बहिष्करण?

Header.h#include <stdbool.h> जो ग में _Bool के लिए एक मैक्रो है है।

file.cpp में Header.h शामिल है, लेकिन file.cpp सी ++ है - इसमें मूल प्रकार के रूप में बूल है। अब लिंट इस वजह से चीजों के एक सेट के बारे में शिकायत करता है (पुनर्विक्रय, गैर-मौजूदा विधियां इत्यादि)। Header.h को छूए बिना file.cpp में <stdbool.h> को शामिल करने से रोकने का कोई तरीका है?

एक समस्या के अपने विवरण हास्यास्पद लग रहा है - कृपया टमाटर मुझ पर :) अन्यथा, धन्यवाद मदद के लिए फेंक देते हैं।

संपादित करें: अब फिर से इस के बारे में सोच: संकलन की बुनियादी अवधारणाओं जानने और जोड़ने मैंने महसूस किया जाना चाहिए था कि नीचे की ओर फाइल में कुछ शीर्ष लेख 'को छोड़कर'/हैडर अजीब लगता है और cludges के बिना संभव नहीं होना चाहिए। लेकिन फिर भी, मदद के लिए धन्यवाद। इसकी मेरी समझ के लिए एक और छोटी ईंट।

+7

अपने लाइब्रेरी विक्रेता से शिकायत करें। 'stdbool.h' को 'bool' और दोस्तों को C++ में मैक्रोज़ के रूप में परिभाषित नहीं करना चाहिए। औसत समय में, '# undef'। –

+2

क्या आप 'header.h' को संशोधित कर सकते हैं? फिर '' सहित पहले '__cplusplus' के लिए सशर्त प्रीप्रोसेसर चेक जोड़ें। और हो सकता है कि आप अपने उस लिटर को देखना चाहें, ऐसा लगता है कि यह सी ++ को बहुत अच्छी तरह से संभालने वाला प्रतीत नहीं होता है, या यह प्रीप्रोसेसिंग बहुत अच्छी तरह से नहीं करता है। –

+2

@ टी.सी. यह इतना आसान नहीं है, सी ++ 98 '' के बारे में कुछ भी नहीं कहता है, इसलिए सी ++ 98 में इसके प्रभाव अनिर्दिष्ट हैं। जीसीसी का '' कारणों से सी ++ 98 के लिए मैक्रोज़ को परिभाषित करता है। क्रैपी कारण यह कम से कम C++ में 'बूल बूल' परिभाषित करता है, हालांकि, # bool _Bool परिभाषित करें जो सक्रिय रूप से हानिकारक है। –

उत्तर

9

आप अपनी खुद की stdbool.h बना सकते हैं और यह पहले रखे गए, रास्ते में तो यह प्रणाली एक से पहले पाया जाता है हो सकता है। यह तकनीकी रूप से अपरिभाषित व्यवहार है, लेकिन आपके पास <stdbool.h> टूटा हुआ है, इसलिए यह इसके आसपास काम करने का एक तरीका है। अपने स्वयं के संस्करण या तो खाली हो सकता है (अगर यह केवल सी ++ फ़ाइलों से शामिल किया जाएगा) या यदि आप यह भी सी फ़ाइलों द्वारा प्रयोग किया जा रहा नहीं रोका जा सकता तो आप कर सकता है:

#if __cplusplus 
# define __bool_true_false_are_defined 1 
#elif defined(__GNUC__) 
// include the real stdbool.h using the GNU #include_next extension 
# include_next <stdbool.h> 
#else 
// define the C macros ourselves 
# define __bool_true_false_are_defined 1 
# define bool _Bool 
# define true 1 
# define false 0 
#endif 

एक क्लीनर समाधान होगा Header.h सहित से पहले file.cppमें ऐसा करते हैं:

#include <stdbool.h> 
// Undo the effects of the broken <stdbool.h> that is not C++ compatible 
#undef true 
#undef false 
#undef bool 
#include "Header.h" 

अब जब Header.h शामिल <stdbool.h> यह कोई प्रभाव नहीं पड़ेगा, क्योंकि यह पहले से ही शामिल किया गया है। इस तरह तकनीकी रूप से अमान्य है (नीचे टिप्पणी देखें), लेकिन अभ्यास में लगभग निश्चित रूप से पोर्टेबल काम करेंगे।

यह प्रत्येक फ़ाइल में किया जाना चाहिए जिसमें Header.h शामिल है, ताकि आप इसे एक नए शीर्षलेख में लपेट सकें और Header.h उदा। CleanHeader.h जिसमें शामिल हैं:

#ifndef CLEAN_HEADER_H 
#define CLEAN_HEADER_H 
// use this instead of Header.h to work around a broken <stdbool.h> 
# include <stdbool.h> 
# ifdef __cplusplus 
// Undo the effects of the broken <stdbool.h> that is not C++ compatible 
# undef true 
# undef false 
# undef bool 
#e ndif 
# include "Header.h" 
#endif 
+1

दूसरा दृष्टिकोण तकनीकी रूप से [macro.names]/p2 का उल्लंघन करती है :) –

+1

@ T.C। doh! आप बिल्कुल सही हैं, मैं अपने दावे को सही कर दूंगा कि यह मान्य है।मुझे लगता है कि यह सबसे अच्छा समाधान है, हालांकि एक गैर-अनुरूप std :: lib के साथ मान्य सी ++ लिखने की कोशिश करना मुश्किल है! –

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