2017-03-16 12 views
6

के इस संरचना पर विचार करें:सी संरचना में अज्ञात फ़ील्ड का नाम कैसे दें?

struct { 
    int a; 
    int _reserved_000_[2]; 
    int b; 
    int _reserved_001_[12]; 
    int c;  
}; 

सुरक्षित क्षेत्रों या कभी नहीं पढ़ा जाना चाहिए लिखा। मेरी संरचना एक एफपीजीए को संबोधित करने के लिए एक वर्णक का प्रतिनिधित्व करती है जहां मुझे बहुत सारे reserved फ़ील्ड मिलते हैं। अंत में मैंने उन्हें यादृच्छिक नाम से नामित किया क्योंकि वर्षों के बाद शुरुआती आरोही संख्या का मतलब अब और कुछ नहीं है।

तो मैं अब है:

struct { 
    int a; 
    int _reserved_3hjdds1_[2]; 
    int b; 
    int _reserved_40iuljk_[12]; 
    int c;  
}; 

यह अधिक बजाय सिर्फ रिक्त फ़ील्ड के लिए सुविधाजनक होगा:

struct { 
    int a; 
    int; 
    int b; 
    int; 
    int c;  
}; 

लेकिन यह काम नहीं करता।

मैं अन्य विकल्प क्या कर सकता हूं जो reserved फ़ील्ड के लिए अद्वितीय नाम खोजने से बचें?

+1

एक कोड जनरेटर लिखें जिसके साथ संरचना घोषणाएं तैयार की जाएंगी। इसे आरक्षित सदस्यों के लिए अनुक्रमिक रूप से क्रमांकित नाम बनाने दें। विशेष रूप से ध्यान दें कि इससे कोई फर्क नहीं पड़ता कि आरक्षित सदस्यों के नाम बदलते हैं, क्योंकि कोई भी उन सदस्यों तक पहुंच नहीं लेता है। –

+0

क्या आपका मतलब 'आरक्षित _ ## __COUNTER__' – nowox

+0

जैसा कुछ है क्योंकि किसी को भी आरक्षित फ़ील्ड का उपयोग नहीं करना है, मुझे नहीं लगता कि यह कैसे मायने रखता है कि प्रारंभिक आरोही संख्या अर्थपूर्ण है या नहीं - इसका उपयोग केवल नामों को अद्वितीय बनाने के लिए किया जाता है। मैं पहले संस्करण के साथ अटक गया होगा ... – Dmitri

उत्तर

3

यह प्राप्त करने के लिए क्या आप मैक्रो-जादू का एक सा के साथ चाहते हैं संभव हो जाना चाहिए:

#include <stdint.h> 

#define CONCAT(x, y) x ## y 
#define EXPAND(x, y) CONCAT(x, y) 
#define RESERVED EXPAND(reserved, __LINE__) 

struct 
{ 
    uint32_t x; 
    uint32_t RESERVED; 
    uint16_t y; 
    uint64_t RESERVED[10]; 
} s; 

यह आप इस तरह के reserved11, reserved13 के रूप में पहचानकर्ता देता है, लेकिन नाम स्पष्ट रूप से कोई फर्क नहीं पड़ता।

+0

अच्छा प्रयास करें, लेकिन मैं अभी भी अपने [उत्तर] (http://stackoverflow.com/a/42838409/2612235=) को कैपिटल मैक्रोज़ और '__COUNTER__' के बारे में चेतावनी के साथ पसंद करता हूं। आप '#' शामिल करना भी भूल गए हैं। – nowox

+1

@nowox '__LINE__' मानक सी है,' __COUNTER__' नहीं है। – Lundin

+1

ध्यान दें कि यदि आपके पास एक ही पंक्ति पर एकाधिक परिभाषा है, तो '__LINE__' काम नहीं करेगा, लेकिन कम से कम आपको कंपाइलर से एक त्रुटि मिलेगी। मुझे अभी भी लगता है कि यह '__COUNTER__' – nowox

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