इस स्निपेट में, VLA करने के लिए एक सूचक आसान पहुँच के लिए एक बड़ा लुकअप तालिका करने के लिए प्रयोग किया जाता है:कास्ट "सूचक VLA const करने के लिए" से "const सूचक"
#pragma GCC diagnostic warning "-Wcast-qual"
char
lookup(int a, int b, int c, char const *raw, int x, int y, int z)
{
typedef char const (*DATA_PTR)[a][b][c];
DATA_PTR data = (DATA_PTR)raw;
return (*data)[x][y][z];
}
जीसीसी 6.2.0क्लैंग 4.0.0 (ट्रंक)-Wcast-qual
सक्षम दोनों के साथ ठीक है, जबकि इस पर चोक करता है।
In function 'lookup':
warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
DATA_PTR data = (DATA_PTR)raw;
^
कोड किसी भी तरह से अपेक्षित है।
मेरा अनुमान है जीसीसी और "VLA const सूचक" "स्थिरांक तत्वों के VLA सूचक" एक confuses लेकिन मैं पहुँच रहा हूँ है ...
वहाँ चेतावनी के साथ नगण्य बिना जीसीसी चुप रहो करने के लिए एक तरीका है? क्या यह एक जीसीसी बग है?
EDIT1: वास्तविक कोड पर
विवरण:
struct table {
int a;
int b;
int c;
char *raw;
};
char
lookup2(struct table const *table, int x, int y, int z)
{
typedef char const(*DATA_PTR)[table->a][table->b][table->c];
DATA_PTR data;
data = (DATA_PTR)table->raw; // GCC ok
data = (DATA_PTR)(char const *)table->raw; // GCC raises -Wcast-qual
return (*data)[x][y][z];
}
EDIT2:
तो वहाँ यह है ... C11 मानक प्रारूप 6.7.3 में कहते हैं/9:
यदि विशिष्ट किसी सरणी प्रकार के आयन में किसी भी प्रकार के क्वालीफायर शामिल होते हैं, तत्व प्रकार इतना योग्य होता है, सरणी प्रकार नहीं।
@hvd उत्तर देखें।
एक हैक -Wcast-qual
मौन करने:
DATA_PTR data = (DATA_PTR)(intptr_t)raw;
"कॉन्स्ट तत्वों के वीएलए के सूचक" और "वीएलए को कॉन्स्ट करने के लिए सूचक" एक ही बात है। एक कॉन्स सरणी कॉन्स तत्वों की एक सरणी है। एक बग की तरह लगता है। – emlai
क्यों पूरी चीज को थोड़ा और अधिक सुरक्षित नहीं बनाते हैं, और 'कच्चे' को 'char const (* raw) [a] [b] [c]' में बनाते हैं? – StoryTeller
@StoryTeller मैंने जोड़ा कि कोड कैसा दिख सकता है लेकिन फिर भी, '-Wcast-qual' अजीब है। – diapir