2011-07-12 25 views
18

यह एक समारोह पैरामीटर के हिस्से के रूप वैरिएबल प्रकार पारित करने के लिए संभव है, उदा .:समारोह पैरामीटर के रूप में चर प्रकार पासिंग

void foo(varType type) 
{ 
    // Cast to global static 
    unsigned char bar; 
    bar = ((type *)(&static_array))->member; 
} 

मुझे याद है यह जीसीसी के typeof और मैक्रो का उपयोग कर के साथ कुछ है?

+5

नहीं मानक सी में हो सकता है कि जीसीसी में, अगर आप (अन) भाग्यशाली रहे हैं। –

उत्तर

12

आप ऐसा नहीं कर सकते एक समारोह के लिए,:

2

मुझे नहीं लगता कि आप सामान्य मामले में यह कैसे कर सकते हैं, यह देखते हुए कि सी statically typed language है।

संकलक को type * का प्रकार ->member के संदर्भ को उत्पन्न करने में सक्षम होने के लिए संकलन समय पर जानने की आवश्यकता है। क्योंकि तब यह के प्रकार के लिए ज़रूरी है

typedef enum { 
    CHAR, 
    INT, 
    FLOAT, 
    DOUBLE 
} TYPE; 

void foo(TYPE t, void* x){ 
    switch(t){ 
     case CHAR: 
      (char*)x; 
      break; 
     case INT: 
      (int*)x; 
      break; 
     ... 
    } 
} 
+0

इतना नकारात्मक न हो और अधिक रवैया कर सकें;) –

25

आप संभव सभी विभिन्न प्रकार के लिए एक enum कर सकता है, और एक स्विच का उपयोग अपसंदर्भन बनाने के लिए कामकाजी मशीन कोड उत्पन्न करने के लिए तर्क (और फ़ंक्शन का उपयोग करने वाले किसी भी अन्य प्रतीक)। आप की तरह एक मैक्रो की कोशिश कर सकते:

#define foo(type_t) ({ \ 
    unsigned char bar; \ 
    bar = ((type_t*)(&static_array))->member; \ 
    ... \ 
    }) 
+0

हाय hugomg, मुझे खेद है, लेकिन मुझे विकल्प समझ में नहीं आता है। क्या आप थोड़ा सा विस्तार कर सकते हैं? धन्यवाद :-) – leaf

+0

मुझे अभी एहसास हुआ कि विकल्प वास्तव में लिखित रूप में काम नहीं करता है ... इसलिए मैंने इसे हटा दिया। लेकिन मूल रूप से मूलभूत विचार "ऑब्जेक्ट ओरिएंटेड" शैली में चीजों को कोड करना था और स्विच स्टेटमेंट के बजाय शाखाकरण करने के लिए उप प्रकार के पॉलीमोर्फिज्म का उपयोग करना था। – hugomg

+0

ठीक है। :-) – leaf

3

नहीं एक समारोह है, लेकिन आप तो जैसे मैक्रो का उपयोग कर सकते हैं:

#include <stdio.h> 
#define swap(type, foo, bar) ({type tmp; tmp=foo; foo=bar; bar=tmp;}) 

int main() { 
    int a=3, b=0; 
    printf("a=%d, b=%d \n", a, b); // a=3, b=0 
    swap(int, a, b); // <-- action happens here 
    printf("a=%d, b=%d \n", a, b); // a=0, b=3 

    return 0; 
} 
संबंधित मुद्दे