आप प्रकार की विशेषताओं के लिए परीक्षण कर सकते हैं।
उदाहरण के लिए, int
नकारात्मक मान रख सकता है, जबकि char*
नहीं कर सकता। तो अगर ((typeof(param))-1) < 0
, param
अहस्ताक्षरित है:
if (((typeof(param))-1) < 0) {
do_something_with_int();
} else {
do_something_with_char_p();
}
संकलक स्पष्ट रूप से यह बाहर का अनुकूलन।
इसे यहाँ का प्रयास करें: http://ideone.com/et0v1
यह और भी आसान है, तो प्रकार विभिन्न आकारों था होगा।उदाहरण के लिए, अगर आप चाहते हैं एक सामान्य मैक्रो लिखने के लिए की तुलना में अलग चरित्र आकार संभाल कर सकते हैं:
if (__builtin_types_compatible_p(typeof(param), int)) {
func_int(param);
} else if (__builtin_types_compatible_p(typeof(param), char*)) {
func_string(param);
}
यह प्रयास करें:
if (sizeof(param) == sizeof(char)) {
/* ... */
} else if (sizeof(param) == sizeof(char16_t)) {
/* ... */
} else if (sizeof(param) == sizeof(char32_t)) {
/* ... */
} else {
assert("incompatible type" && 0);
}
जीसीसी एक __builtin_types_compatible_p()
builtin समारोह है कि प्रकार संगतता के लिए जाँच कर सकते हैं यहां: http://ideone.com/lEmYE
आप इसे करने के लिए जो प्रयास कर रहे हैं उसे प्राप्त करने के लिए आप इसे मैक्रो में डाल सकते हैं:
#define FUNC(param) ({ \
if (__builtin_types_compatible_p(typeof(param), int)) { \
func_int(param); \
} else if (__builtin_types_compatible_p(typeof(param), char*)) { \
func_string(param); \
} \
})
(({...})
GCC's statement expression है, यह बयानों के समूह को एक रैल्यू होने की अनुमति देता है।
__builtin_choose_expr()
बिल्टिन संकलन करने के लिए अभिव्यक्ति का चयन कर सकते हैं।
#define FUNC(param) \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(param), int) \
, func_int(param) \
, __builtin_choose_expr(__builtin_types_compatible_p(typeof(param), char*) \
, func_string(param) \
, /* The void expression results in a compile-time error \
when assigning the result to something. */ \
((void)0) \
) \
)
यह वास्तव में से एक थोड़ा संशोधित उदाहरण है (इस मामले में somehting अमान्य संकलन के द्वारा): __builtin_types_compatible_p के साथ इस करता है, तो परम के प्रकार दोनों int
और char*
साथ संगत नहीं है संकलन समय पर एक त्रुटि को गति प्रदान करने की अनुमति देता है __builtin_choose_expr docs।
यहां तक कि यदि यह संभव था, तो यह बेहद खराब होगा। सी इसके लिए डिजाइन नहीं किया गया था। Structs और यूनियनों का प्रयोग करें, आप इस तरह से रन-टाइम प्रेषण भी प्राप्त कर सकते हैं। –