एक दृष्टिकोण संकेत की मदद से 2 मूल्यों लौट सकते हैं मैक्रो का उपयोग करने के लिए है। एक हेडर फाइल में इस जगह multitype.h
#include <stdlib.h>
/* ============================= HELPER MACROS ============================= */
/* __typeof__(V) abbreviation */
#define TOF(V) __typeof__(V)
/* Expand variables list to list of typeof and variable names */
#define TO3(_0,_1,_2,_3) TOF(_0) v0; TOF(_1) v1; TOF(_2) v2; TOF(_3) v3;
#define TO2(_0,_1,_2) TOF(_0) v0; TOF(_1) v1; TOF(_2) v2;
#define TO1(_0,_1) TOF(_0) v0; TOF(_1) v1;
#define TO0(_0) TOF(_0) v0;
#define TO_(_0,_1,_2,_3,TO_MACRO,...) TO_MACRO
#define TO(...) TO_(__VA_ARGS__,TO3,TO2,TO1,TO0)(__VA_ARGS__)
/* Assign to multitype */
#define MTA3(_0,_1,_2,_3) _0 = mtr.v0; _1 = mtr.v1; _2 = mtr.v2; _3 = mtr.v3;
#define MTA2(_0,_1,_2) _0 = mtr.v0; _1 = mtr.v1; _2 = mtr.v2;
#define MTA1(_0,_1) _0 = mtr.v0; _1 = mtr.v1;
#define MTA0(_0) _0 = mtr.v0;
#define MTA_(_0,_1,_2,_3,MTA_MACRO,...) MTA_MACRO
#define MTA(...) MTA_(__VA_ARGS__,MTA3,MTA2,MTA1,MTA0)(__VA_ARGS__)
/* Return multitype if multiple arguments, return normally if only one */
#define MTR1(...) { \
typedef struct mtr_s { \
TO(__VA_ARGS__) \
} mtr_t; \
mtr_t *mtr = malloc(sizeof(mtr_t)); \
*mtr = (mtr_t){__VA_ARGS__}; \
return mtr; \
}
#define MTR0(_0) return(_0)
#define MTR_(_0,_1,_2,_3,MTR_MACRO,...) MTR_MACRO
/* ============================== API MACROS =============================== */
/* Declare return type before function */
typedef void* multitype;
#define multitype(...) multitype
/* Assign return values to variables */
#define let(...) \
for(int mti = 0; !mti;) \
for(multitype mt; mti < 2; mti++) \
if(mti) { \
typedef struct mtr_s { \
TO(__VA_ARGS__) \
} mtr_t; \
mtr_t mtr = *(mtr_t*)mt; \
MTA(__VA_ARGS__) \
free(mt); \
} else \
mt
/* Return */
#define RETURN(...) MTR_(__VA_ARGS__,MTR1,MTR1,MTR1,MTR0)(__VA_ARGS__)
यह एक समारोह से चार चर भी लौट सकते हैं और उन्हें करने के लिए चार चर को असाइन करना संभव बनाता है। एक उदाहरण के रूप में, आप उन्हें इस तरह का उपयोग कर सकते हैं:
(55, 3.9, 24.15)
समाधान है क्योंकि यह variadic मैक्रो और तक- के लिए C99 या आवश्यकता है बाद में के रूप में पोर्टेबल नहीं हो सकता है:
multitype (int,float,double) fun() {
int a = 55;
float b = 3.9;
double c = 24.15;
RETURN (a,b,c);
}
int main(int argc, char *argv[]) {
int x;
float y;
double z;
let (x,y,z) = fun();
printf("(%d, %f, %g\n)", x, y, z);
return 0;
}
यह यह क्या प्रिंट है कथन परिवर्तनीय घोषणाएं। लेकिन मुझे लगता है कि यह यहां पोस्ट करने के लिए काफी दिलचस्प था। एक और मुद्दा यह है कि यदि आप उन्हें गलत मान निर्दिष्ट करते हैं तो संकलक आपको चेतावनी नहीं देगा, इसलिए आपको सावधान रहना होगा।
अतिरिक्त उदाहरण, और यूनियनों का उपयोग कर कोड का एक स्टैक-आधारित संस्करण, मेरे github repository पर उपलब्ध है।
'स्ट्रिंग' से आपका मतलब है "मैं सी ++ का उपयोग कर रहा हूं और यह 'std :: string' class" है या "मैं सी का उपयोग कर रहा हूं और यह एक' char *' पॉइंटर या 'char [] 'है सरणी। " –
अच्छी तरह से, मेरे विशेष मामले में, वे दो चींटियां थीं: एक 'स्कोर' के लिए जो मैं तुलना कर रहा था, और 'इंडेक्स' के लिए एक जहां अधिकतम स्कोर मिला था। मैं सिर्फ एक सामान्य उदाहरण – sepiroth
के लिए एक स्ट्रिंग उदाहरण का उपयोग करना चाहता था संदर्भ के अनुसार स्ट्रिंग पास करें और int वापस दें। सबसे तेज़ तरीका। कोई structs आवश्यक है। –