2012-01-17 14 views
5

पर विचार करें निम्नलिखित C99 समारोह:क्या कोई डमी लैवल्यू है जिसका प्रयोग तब किया जा सकता है जब कुछ भी निष्पादित नहीं किया जाता है?

void port_pin_set(const bool value, const uint8_t pin_mask) 
{ 
    if (value) { 
     PORT |= pin_mask; 
    } else { 
     PORT &= ~pin_mask; 
    } 
} 

PORT एक define जा रहा है, उदाहरण के लिए:

  • इसे स्वीकार कर लिया जाता है:

    #define PORT (P1OUT) 
    

    वहाँ PORT को फिर से परिभाषित करने के लिए इतना है कि एक रास्ता है एक lvalue के रूप में,

  • समारोह कोई भी नहीं करता है जी।

मैं क्या करना चाहता हूं, फ़ंक्शन स्रोत को रखना, जबकि इसे कुछ भी करने के लिए संकलित करना है।

संपादित करें: मुझे पता है कि इस तरह के एक लाभा का उपयोग सबसे अच्छा समाधान नहीं हो सकता है। मैं इस विशिष्ट समस्या के लिए सबसे अच्छा समाधान नहीं ढूंढ रहा हूं, मुझे भाषा में दिलचस्पी है। यह एक सैद्धांतिक सवाल है, व्यावहारिक नहीं है। आपके मामले के लिए

#ifdef PORT 
#undef PORT 
#endif 

#define PORT int x = 0; x 

:

+0

मुझे लगता है कि असली सवाल यह है कि आप ऐसा क्यों करना चाहते हैं? एक दिलचस्प सी प्रीप्रोसेसर जादू प्रश्न के दौरान, मुझे संदेह है कि आपको वास्तव में ऐसा करने की ज़रूरत है। –

+0

मैं अधिक उत्सुक हूँ। मैं संकलन कमांड से फ़ाइल को हटा देता, लेकिन फ़ंक्शन में एक शीर्षलेख फ़ाइल में एक इनलाइन परिभाषा होती है जिसमें कई स्थानों पर '# शामिल' है। – Gauthier

+0

आप फ़ंक्शन –

उत्तर

10

सी 99 में यौगिक अक्षर हैं जिनका उपयोग इस तरह के कार्य के लिए किया जा सकता है। उनके वाक्य रचना एक डाली एक प्रारंभकर्ता द्वारा पीछा किया है:

#define PORT ((int){0}) 

अपने मामले में यह करना चाहिए, केवल यह है कि आप अप्रयुक्त मूल्यों या तो के बारे में कुछ चेतावनियों मिल सकता है।

कोई भी सभ्य संकलक इस तरह के यौगिक शाब्दिक आउट को असाइनमेंट अनुकूलित करेगा।

+0

शानदार, यह वही है जो मैं खोज रहा था, मुझे लगा कि यह संभव था। आपने मुझे यौगिक अक्षर के बारे में फिर से पढ़ा, धन्यवाद! – Gauthier

+0

जैसा कि मेरे मूल प्रश्न के संपादन में बताया गया है, यह नहीं है कि मैं इसे कैसे कार्यान्वित करूंगा (अगर इसके बजाय अगर अधिक पढ़ा जा सकता है)। लेकिन मेरा सवाल भाषा संरचनाओं के उद्देश्य से था, और इस जवाब ने इसे अभी तक खींचा। – Gauthier

2

यह C99 में यह करना चाहिए। लेकिन मैं सुझाव है कि आप के बजाय PORT को पुनर्परिभाषित करने की #ifdef के बीच पूरे कोड डाल:

void port_pin_set(const bool value, const uint8_t pin_mask) 
{ 
#ifdef BUILD_PORT_PIN_SET 
    if (value) { 
     PORT |= pin_mask; 
    } else { 
     PORT &= ~pin_mask; 
    } 
#endif 
} 
+4

निश्चित रूप से, यह ब्लॉक के बीच में 'पोर्ट' का उपयोग किया जा रहा है, या प्रति ब्लॉक कई बार, 'x'' नामक उपयोगकर्ता चर होने की संभावना का उल्लेख नहीं करेगा। (मुझे लगता है कि ओपी एक उचित जेनेरिक समाधान चाहता है, जो कि इस उदाहरण के लिए काम करता है।) – NPE

+0

@aix इसका उद्देश्य उनके विशिष्ट उदाहरण के लिए था। यह विशिष्ट प्रतीत होता है। –

+0

आप सी –

8

आप के रूप में एक ही प्रकार के एक चर परिभाषित कर सकते हैं अपने P1OUT (जैसे कि, unsigned char),, यह शीर्षक में उपलब्ध बनाने और स्रोतों में से एक में यह परिभाषित करते हैं, इस तरह:

हैडर:

extern unsigned char dummy_P1OUT; 
#define PORT (dummy_P1OUT) 

सी फ़ाइल:

unsigned char dummy_P1OUT; 

Usages:

PORT &= ~pin_mask; 

if (PORT & pin_mask) { 
    blink_led(); 
} 
+0

कृपया आप यह बता सकते हैं कि यह ओपी की समस्या को हल करता है (कंपाइलर को कोई कोड उत्पन्न करने के लिए मजबूर नहीं करता है।) – NPE

+3

@aix मैंने इसे "कुछ भी करने के लिए संकलित" को " कंपाइलर को कोई कोड उत्पन्न करने के लिए मजबूर नहीं करना ": ओपी के इरादे की मेरी समझ यह है कि वह परिणाम चाहता है जो उसके कार्यक्रम से प्रासंगिक चीजों को नहीं बदले, जैसे किसी प्रोग्राम के अग्रेषण आउटपुट को यूनिक्स पर'/dev/null' के समान। – dasblinkenlight

+0

पर्याप्त मेला। मुझे यकीन नहीं है कि ओपी का इरादा क्या है, लेकिन यह व्याख्या भी समझ में आता है। – NPE

0

सी में विकृतियों ++ कि काम कर सकता है कर रहे हैं। उदाहरण के लिए, आप PORT को मूल्य से ऑब्जेक्ट वापस करने के लिए परिभाषित कर सकते हैं, जो |= और &= ऑपरेटरों को लागू करता है।

सी में मैं निम्न तरीके से एक तरीके से पता लगा सकता हूं: शुरुआत में एक पूर्णांक चर परिभाषित करें, तो PORT या तो इस चर या प्रासंगिक एक (आपके मामले में) परिभाषित किया जा सकता है।

जब PORT स्थानीय चर के लिए परिभाषित किया गया है - तो आप उम्मीद कर सकते हैं कि संकलक इस कोड को छोड़ देगा: स्थानीय चर को एक मान निर्दिष्ट नहीं किया जाता है।

0

मैंने उबंटू पर नीचे दिए गए बयान का परीक्षण किया और यह पर्यावरण परिवर्तनीय पथ के पहले चरित्र को नहीं लिखता है, जहां यह विंडोज पर करता है। हालांकि परिभाषा के अनुसार यह अपरिभाषित व्यवहार का कारण बनता है।

#define PORT (*(uint8_t*)(getenv("PATH"))) 

तो यह सुरक्षित एक एक डमी पर्यावरण मूल्य कार्यक्रम में कहीं परिभाषित करने और है कि बजाय स्थापित करने के लिए जारी रख सकते हैं बनाने के लिए।

#include <stdlib.h> 

#ifdef PORT 
#undef PORT 
#endif 

#define SETDUMMYPORT (putenv("dummyPORT=x")) 
#define PORT (*(uint8_t*)(getenv("dummyPORT"))) 

कार्यक्रम में कहीं डमी वातावरण चर सेट:

int main(int argc, char* argv[]) 
{ 
    SETDUMMYPORT; 
} 

तो बंदरगाह के रूप में आप अपने प्रश्न में है इस्तेमाल किया जा सकता।

+1

वाह, यौगिक अक्षरों को अनुकरण करने के लिए 'getenv' का उपयोग करके, कभी नहीं देखा है। यह वास्तव में अलग सोच रहा है :) दुर्भाग्य से आपका समाधान एक बहुत ही खतरनाक है। 'Getenv' का 'मैन' पृष्ठ कहता है: * कॉलर को इस स्ट्रिंग को संशोधित न करने का ध्यान रखना चाहिए, क्योंकि इससे प्रक्रिया का माहौल बदल जाएगा। * –

+0

ठीक है, मैं यह नहीं कह रहा कि यह सुरक्षित है, और मैंने यह भी कहा यह मेरे पहले पैराग्राफ में है। हालांकि इस तंत्र को नियंत्रित किया जाता है, लेकिन मुझे यह कहना है कि सी निश्चित रूप से इस तरह की चालबाजी में खुद को उधार देता है। – Jack

+0

नहीं, आधुनिक सी में अस्थायी अंतराल का उत्पादन करने के लिए एक तंत्र है जो नौकरी के लिए पूरी तरह उपयुक्त है। कृपया मेरा जवाब देखें। –

1

सीधे lvalue नहीं, लेकिन मुझे उम्मीद है कि यह आपके उद्देश्य की सेवा करेगा।

#define PORT if (0) P1OUT 

इसे प्रभावी रूप से पूर्ण विवरण को निरस्त करना चाहिए। आपको कुछ चेतावनियां मिल सकती हैं, लेकिन यह आईएमएचओ के लिए अतिमूल्य होना चाहिए।

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

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