समस्या
एक में निम्न स्तर नंगे धातु एम्बेडेड संदर्भ, मैं एक सी ++ ढांचे के भीतर है और किसी भी नाम के बिना स्मृति में एक रिक्त स्थान बनाने के लिए, का उपयोग इस तरह के स्मृति स्थान के लिए उपयोगकर्ता मना करना चाहते हैं।
अभी, मैंने इसे एक बदसूरत uint32_t :96;
बिटफ़ील्ड डालकर हासिल किया है जो आसानी से तीन शब्दों की जगह ले लेगा, लेकिन यह जीसीसी (बिटफील्ड बहुत बड़ी है जो uint32_t में फिट होने के लिए एक चेतावनी देगा), जो कि बहुत वैध है।
जब यह ठीक काम करता है, तो यह बहुत साफ नहीं होता है जब आप उन सैकड़ों चेतावनियों के साथ एक पुस्तकालय वितरित करना चाहते हैं ...
मैं ठीक से कैसे करूँ?
पहली बार में मुद्दा क्यों है?
जिस प्रोजेक्ट पर मैं काम कर रहा हूं, उसमें पूरे माइक्रोकंट्रोलर लाइन (STMicroelectronics STM32) के विभिन्न बाह्य उपकरणों की मेमोरी संरचना को परिभाषित करना शामिल है। ऐसा करने के लिए, परिणाम एक वर्ग है जिसमें कई संरचनाओं का एक संघ होता है जो सभी रजिस्टरों को परिभाषित करता है, जो लक्षित माइक्रोकंट्रोलर पर निर्भर करता है।
एक बहुत ही सरल परिधीय के लिए एक सरल उदाहरण निम्नलिखित है: एक सामान्य उद्देश्य इनपुट / आउटपुट (GPIO)
union
{
struct
{
GPIO_MAP0_MODER;
GPIO_MAP0_OTYPER;
GPIO_MAP0_OSPEEDR;
GPIO_MAP0_PUPDR;
GPIO_MAP0_IDR;
GPIO_MAP0_ODR;
GPIO_MAP0_BSRR;
GPIO_MAP0_LCKR;
GPIO_MAP0_AFR;
GPIO_MAP0_BRR;
GPIO_MAP0_ASCR;
};
struct
{
GPIO_MAP1_CRL;
GPIO_MAP1_CRH;
GPIO_MAP1_IDR;
GPIO_MAP1_ODR;
GPIO_MAP1_BSRR;
GPIO_MAP1_BRR;
GPIO_MAP1_LCKR;
uint32_t :32;
GPIO_MAP1_AFRL;
GPIO_MAP1_AFRH;
uint32_t :64;
};
struct
{
uint32_t :192;
GPIO_MAP2_BSRRL;
GPIO_MAP2_BSRRH;
uint32_t :160;
};
};
जहां सभी GPIO_MAPx_YYY
एक मैक्रो है, जिसे या तो uint32_t :32
रजिस्टर या रजिस्टर प्रकार (एक समर्पित संरचना) के रूप में परिभाषित किया गया है।
यहां आप देखते हैं कि uint32_t :192;
कौन सा काम अच्छा है, लेकिन यह एक चेतावनी को ट्रिगर करता है।
मैंने अब तक क्या माना है:
मैंने इसे कई uint32_t :32;
(6 यहां) से बदल दिया होगा , लेकिन मेरे पास कुछ चरम मामले हैं जहां मेरे पास uint32_t :1344;
(42) हैं (अन्य के बीच)। इसलिए मैं इसके बजाय 8k दूसरों के शीर्ष पर लगभग एक सौ लाइनें नहीं जोड़ना चाहूंगा, भले ही संरचना पीढ़ी स्क्रिप्टेड हो।
सटीक चेतावनी संदेश कुछ इस तरह है:
width of 'sool::ll::GPIO::<anonymous union>::<anonymous struct>::<anonymous>' exceeds its type
(मैं सिर्फ प्यार करता हूँ कि यह कितना छायादार है)।
मैं केवल चेतावनी को हटाकर इसे हल नहीं करूंगा , बल्कि इसका उपयोग करना चाहिए
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-WTheRightFlag"
/* My code */
#pragma GCC diagnostic pop
एक समाधान हो सकता है ... अगर मुझे लगता है TheRightFlag
। लेकिन, जैसा कि में बताया इस सूत्र , gcc/cp/class.c
यह दुख की बात कोड भाग के साथ:
warning_at (DECL_SOURCE_LOCATION (field), 0,
"width of %qD exceeds its type", field);
जो हमें बताता है कि -Wxxx
इस चेतावनी को हटाने के लिए कोई झंडा नहीं है ...
uint32_t :192;
।
:42*32
इसके बजाय:1344
char unused[12];
इस पर विचार किया है?