मैं सी में फ़ंक्शन ओवरलोडिंग को कार्यान्वित करने का प्रयास कर रहा हूं, और मैं बहुत करीब हूं। मैं सी 99 का उपयोग कर रहा हूं इसलिए सी 11 में पेश किए गए _Generic
कीवर्ड मेरे लिए उपलब्ध नहीं है। मैंने कुछ कामकाजी कोड विकसित किए हैं, लेकिन जब मैं इसे संकलित करता हूं तो मुझे कुछ चेतावनियां मिलती हैं।जीसीसी का उपयोग कर सी में फ़ंक्शन ओवरलोडिंग - कंपाइलर चेतावनियां
कार्य उदाहरण:
#include <stdio.h>
#define print(x) \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(x), int ), print_int(x) , \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(x), char[]), print_string(x), \
(void)0))
void print_int(int i) {
printf("int: %d\n", i);
}
void print_string(char* s) {
printf("char*: %s\n", s);
}
int main(int argc, char* argv[]) {
print(1);
print("this");
return 0;
}
संकलन निम्नलिखित चेतावनी बनाता है:
gcc overload.c -o main
overload.c: In function 'main':
overload.c:19: warning: passing argument 1 of 'print_string' makes pointer from integer without a cast
overload.c:20: warning: passing argument 1 of 'print_int' makes integer from pointer without a cast
थोड़ा और डिबगिंग जानकारी के लिए, यहाँ मुख्य कार्य की तरह के बाद पूर्वप्रक्रमक अपने काम करता दिखता है:
int main(int argc, char* argv[]) {
__builtin_choose_expr(__builtin_types_compatible_p(typeof(1), int), print_int(1) , __builtin_choose_expr(__builtin_types_compatible_p(typeof(1), char[]), print_string(1), (void)0));
__builtin_choose_expr(__builtin_types_compatible_p(typeof("this"), int), print_int("this") , __builtin_choose_expr(__builtin_types_compatible_p(typeof("this"), char[]), print_string("this"), (void)0));
return 0;
}
मैं संकलन चेतावनियां कैसे दूर कर सकता हूं और sti काम कोड होगा?
मुझे विश्वास है कि यह 'print_string (1)' और 'print_int (" this ") 'पर कॉल है, जो चेतावनियां पैदा कर रहे हैं, लेकिन इन कॉलों का मिलान कभी नहीं होगा क्योंकि प्रकार मेल नहीं खाते हैं। – tjwrona1992
'print_int (x)' या 'print_string (x) 'चुनने के बजाय, यदि आप' print_int' या' print_string' चुनते हैं और चुने गए फ़ंक्शन (पॉइंटर) को x पर लागू करते हैं? – user2357112
@ user2357112, मैं ऐसा करने के बारे में कैसे जाऊं? मैं फ़ंक्शन पॉइंटर्स के साथ बहुत अच्छा नहीं हूं। – tjwrona1992