एक दृष्टिकोण मैक्रोज़ का उपयोग करना है। इसे हेडर फ़ाइल में रखेंmultitype.h
#include <stdlib.h>
#define TOF(V) __typeof__(V)
#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__)
#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__)
#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
typedef void* multitype;
#define multitype(...) multitype
#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
#define RETURN(...) MTR_(__VA_ARGS__,MTR1,MTR1,MTR1,MTR0)(__VA_ARGS__)
यह एक फ़ंक्शन से चार चर तक लौटने और उन्हें चार चर तक असाइन करना संभव बनाता है। एक उदाहरण के रूप में, आप उन्हें इस तरह से उपयोग कर सकते हैं:
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;
}
यह वह है जो यह प्रिंट करता है:
(55, 3.9, 24.15)
समाधान उतना पोर्टेबल नहीं हो सकता क्योंकि इसके लिए C99 या बाद में वैरिएड मैक्रोज़ और फॉर-स्टेटमेंट वेरिएबल डिक्लेरेशन की आवश्यकता होती है। लेकिन मुझे लगता है कि यहां पोस्ट करना काफी दिलचस्प था। एक और मुद्दा यह है कि संकलक आपको चेतावनी नहीं देगा यदि आप उन्हें गलत मान देते हैं, तो आपको सावधान रहना होगा।
अतिरिक्त उदाहरण, और यूनियनों का उपयोग करके कोड का एक स्टैक-आधारित संस्करण, मेरे गितुब भंडार में उपलब्ध है ।
string
कर क्या आपका मतलब है "मैं सी ++ उपयोग कर रहा हूँ और यहstd::string
वर्ग" या "मैं सी का उपयोग कर रहा है और इस एक हैchar *
सूचक याchar[]
सरणी।"