संकलन समय पर एनम मूल्यों की जांच - सी, कंपाइलर-निर्माण, जोर देते हैं

मैं संकलन समय पर स्थिर इनटाइलाइज़र की जांच करना चाहता हूं। मैं मैक्रो कैसर्ट () से कार्यान्वित कर रहा हूं यह प्रश्न

अब, मेरे पास यह "अजीब" स्थिति है

typedef enum
{
EQADC_CHAN_A_00 = 0,
EQADC_CHAN_A_01,
EQADC_CHAN_A_02,
EQADC_CHAN_A_03,
EQADC_CHAN_A_04,
...                 // Others
EQADC_CHAN_MAX      // EQADC_CHAN_MAX = 62

} eQadc_tInputBiosId;

और मेरे पास इस तरह की संरचना शुरू हुई है:

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] = {
{ 123 },  /* EQADC_CHAN_A_00 */
{ 321 },  /* EQADC_CHAN_A_01 */
...       /* Others */
};

अजीब क्या है (मेरे लिए ...) यह है कि निम्नलिखित कथन

CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) != 62 );

ठीक काम करता है, और वास्तव में "पास" (यानी त्रुटियों के बिना संकलित)। इसके बजाए, यह:

CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) != EQADC_CHAN_MAX );

नहीं (यानी यह वास्तव में एक दावा उत्पन्न करता है, और संकलक को रोकता है।

यह समझने की कोशिश कर रहा है कि ऐसा क्यों होता है, मुझे लगता हैकि समस्या EQADC_CHAN_MAX के मान से संबंधित है, जो संकलन समय पर ज्ञात नहीं है, एक enum मान होने के नाते। यदि ऐसा है, तो मैं अभी भी यह घोषणा क्यों नहीं कर सकता

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX]

वास्तव में सरणी के लिए सही आकार को तुरंत चालू करता है ... मैं इसे कैसे बेहतर (बेहतर) कार्यान्वित कर सकता हूं इस पर कोई मदद की सराहना की जाती है।

संपादित करें: मेरी गलती। सही वाक्यविन्यास है

CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) == EQADC_CHAN_MAX );

इसके अलावा, सरणी को इस तरह घोषित करने के रूप में ध्यान दें:

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] = { Initializers ....}

वास्तव में EQADC_CHAN_MAX तत्वों के आकार आवंटित करता है, भले ही संख्या प्रारंभ तत्व वास्तव में सही नहीं है। तो, इसे लागू करने का सही तरीका यह है:

const t_EQADC_Pin_Config EQADC_xPinConfig[] = { Initializers ....}
CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) == EQADC_CHAN_MAX );

आप सभी को धन्यवाद।

उत्तर:

जवाब के लिए 2 № 1

अच्छी तरह से देखिए यह धागा

अगर यह मदद नहीं करता है तो क्या आप अपना भाग सकते हैंप्री-प्रोसेसर आउटपुट का उत्पादन करने के लिए -पी विकल्प के साथ संकलन चरण, या जो भी आपके कंपाइलर के लिए है? इससे यह स्पष्ट हो सकता है कि आपके दूसरे दावे में भविष्यवाणी आपके द्वारा अपेक्षित चीज़ों का मूल्यांकन क्यों नहीं करती है।

इसके अलावा, आप क्यों जोर दे रहे हैं कि उस सरणी का आकार है नहीं 62?


जवाब के लिए 0 № 2

क्या आप सकारात्मक हैं EQADC_CHAN_MAX == 62? क्या आप एक डाल सकते हैं printf("%d", EQADC_CHAN_MAX) सुनिश्चित करना?


संबंधित सवाल
सबसे लोकप्रिय