के साथ संरचना सदस्य संरेखण मैं निम्नलिखित के बारे में सोच रहा था: नया _Alignas
संरेखण संरचना सदस्यों के लिए लागू C11 में निर्दिष्ट है?_Alignas
मैं हमेशा इतना मान लिया गया है, लेकिन N1570 सार्वजनिक मसौदा का पूरी तरह से पढ़ने संकेत मिलता है कि एक संरेखण-विनिर्देशक , एक विनिर्देशक-क्वालीफायर-सूची में प्रकट नहीं कर सकते हैं जो कि मैं कहाँ 'लगता है डी होने की उम्मीद है, अगर यह समर्थित था। मैं व्याकरण बार के एक जोड़े पढ़ा है लेकिन समझ नहीं कैसे _Alignas
एक संरचना सदस्य घोषणा में अनुमति दी जा माना जाता है।
हालांकि, मुझे लगता है मानक के इरादे कि _Alignas
_Alignas
(§ 6.7.5) पर पैरा के रूप में सदस्यों की संरचना करने के लिए लागू किया जाना चाहिए है कि कहा गया है कि "एक संरेखण विशेषता में निर्दिष्ट नहीं किया जाएगा [...] एक बिट-फील्ड की घोषणा "। यह देखते हुए कि शब्द "बिट-फील्ड" को § 6.7.2.1 में परिभाषित किया गया है, एक संरचना सदस्य (सटीक शब्द: "ऐसे सदस्य को बिट-फील्ड" कहा जाता है), मैंने हमेशा उस वाक्य को व्याख्या की थी गैर-बिट-फील्ड सदस्यों के लिए स्पष्ट रूप से संरेखण विनिर्देशकों की अनुमति थी।
मौजूदा कार्यान्वयन के खिलाफ जांच कर रहा है पता चलता है कि दोनों बजना 3.0 और जीसीसी 4.7 समर्थन _Alignas
संरचना के सदस्यों पर बिना (-pedantic
के साथ) में शिकायत। बजना स्रोत कोड N1570 से ही व्याकरण reproduces, सिवाय Parser::ParseSpecifierQualifierList
संरेखण विनिर्देशक अनुमति देता है; समारोह एक TODO तत्व सम्मिलित करता है, हालांकि, कि पढ़ता है:
/// TODO: diagnose attribute-specifiers and alignment-specifiers.
जीसीसी सी पार्सर कोड समान, यानी भले ही यह उद्धरण मानक व्याकरण प्रतीत होता है, यह विनिर्देशक-क्वालीफायर में संरेखण विनिर्देशक की अनुमति देता है सूचियों।
मैंने ज्ञात दोषों की सूची भी जांच की है, साथ ही comp.lang.c और comp.std.c, यह देखने के लिए कि विषय वहां उठाया गया था, लेकिन यह प्रतीत नहीं होता है मामला। इसलिए, मेरा प्रश्न: संरेखण संरचना सदस्यों पर अनुमत होने वाले विनिर्देशक हैं?
संपादित करें: प्रासंगिक व्याकरण नियम हैं:
// Compare this...
(6.7) declaration-specifiers:
storage-class-specifier declaration-specifiers_opt
type-specifier declaration-specifiers_opt
type-qualifier declaration-specifiers_opt
function-specifier declaration-specifiers_opt
// This seems to be the only place that mentions
// alignment-specifier on the rhs of a rule.
alignment-specifier declaration-specifiers_opt
(6.7.2.1) struct-or-union-specifier:
struct-or-union identifier_opt { struct-declaration-list }
struct-or-union identifier
(6.7.2.1) struct-declaration-list:
struct-declaration
struct-declaration-list struct-declaration
(6.7.2.1) struct-declaration:
specifier-qualifier-list struct-declarator-list_opt ;
static_assert-declaration
// ...to this.
(6.7.2.1) specifier-qualifier-list:
type-specifier specifier-qualifier-list_opt
type-qualifier specifier-qualifier-list_opt
// Missing alignment-specifier specifier-qualifier-list_opt?
(6.7.5) alignment-specifier:
_Alignas (type-name)
_Alignas (constant-expression)
मैं देखता हूं --- मुझे उस बिट को याद आया (या शायद इसे कई बार फिर से पढ़ा जाए कि जब मैं अंततः एसओ पर पोस्ट करता हूं तो यह किसी भी तरह से फिसल जाता है); यह मेरी समझ भी थी, कि यह सदस्यों के लिए आवेदन करना था। लेकिन फिर मैंने क्लैंग और जीसीसी के आसपास जांच शुरू कर दी और उलझन में आ गया। यदि आपके पास समय है, तो क्या आप व्याकरण को भी देख सकते हैं? मैंने शायद कुछ भी याद किया होगा ... (चूंकि मैंने उस मार्ग को याद किया है जिसे आप उद्धृत कर रहे हैं, जो वास्तव में मंशा को स्पष्ट करता है) धन्यवाद। – rz0
@ rz0, कृपया मेरा संपादन देखें। –
तो यह सिर्फ मेरी चीजें नहीं देख रहा था ... इस मुद्दे को देखने के लिए समय निकालने के लिए धन्यवाद। एक दोष की रिपोर्टिंग के बारे में, मानक समिति AFAIK एक हर्मेमिक बॉडी है और मेरे जैसे इंटरनेट पर कुछ यादृच्छिक लड़के के लिए थोड़ा डरावना है। लेकिन अगर त्रुटि असली है, तो मुझे यकीन है कि विभिन्न कार्यान्वयनकर्ताओं के साथ शुरू होने वाला कोई भी व्यक्ति इसे जल्द या बाद में नोटिस करेगा। :) (क्लैंग कोड में TODO इंगित करता है कि कम से कम किसी ने 'विनिर्देशक-क्वालीफायर-सूची' में 'संरेखण-विनिर्देशक' की अनुपस्थिति देखी है।) – rz0