2010-02-20 28 views
5

को देखते हुए:सी मैक्रो तर्क 'भंडारण'

#define f(x, y) (x+y) 
#define g(x, y) (x*y) 
#define A 1, 2 
#define B 2, 3 

int main() { 
    int a = f(A); 
    int b = g(A); 
    int c = f(B); 
    int d = g(B); 
} 

जो काम नहीं करता,

कैसे मैं यह काम कर सकते हैं? मूल विचार यह है कि मेरे पास तर्कों की एक सूची है कि मैं हर बार लंबे तर्कों की सूची दोहराए बिना दो अलग-अलग मैक्रोज़ पास करना चाहता हूं।

क्या ऐसा करने का कोई तरीका है? [आप f & जी संशोधित करने के लिए आपका स्वागत है; जिस तरह से मैं मैक्रोज़ को कॉल करता हूं, आपको & संशोधित करने के लिए भी आपका स्वागत है। केवल आवश्यकताएँ हैं: 1) arguemnt सूची केवल एक बार 2) यह मुश्किल कोडित नहीं किया जा सकता दिखाई दे सकता है ... तो यह है कि मैं अलग तर्क

साथ मैक्रो कॉल कर सकते हैं आप समाधान नहीं करता है तो काफी काम लेकिन 'लगभग काम करता है' (लगभग आपकी परिभाषा के लिए), मैं इसे भी सुनना चाहता हूं, शायद मैं इसे काम करने के लिए परेशान कर सकता हूं।

धन्यवाद!

संपादित करें: एफ & जी मैक्रोज़ होना चाहिए। वे प्रतीक नामों को पकड़ते हैं और उन्हें कुशल बनाते हैं।

+0

साथ काम करता है आप अपने मूल प्रश्न की आवश्यकताओं को बदल रहे हैं एक संस्करण, एक उपयुक्त उदाहरण प्रदान करें जो दर्शाती है कि आप वास्तव में चाहते हैं। –

उत्तर

3

संपादित करें: कि असंशोधित A और B

#define f(x, y) (x+y) 
#define g(x, y) (x*y) 
#define A 1, 2 
#define B 2, 3 

#define APPLY2(a, b) a b 
#define APPLY(a, b) APPLY2(a, (b)) 

int main(int argc, char* argv[]) 
{ 
    int x= APPLY(f, A); 
    int y= APPLY(f, B); 
    int z= APPLY(g, A); 
    int d= APPLY(g, B); 

    return 0; 
} 
+0

यह सरल है। कोई भी जो समझता है वह इस उत्तर को ऊपर उठाएगा। – anon

+0

अतिरिक्त संकेत क्यों? 'परिभाषित करें (ए, बी) ए (बी) 'बस काम करता है। –

+0

@ क्रिस, यह इस तरह से काम नहीं करता है। मैं सटीक राजन भूल जाता हूं, लेकिन एमएसवीसी निश्चित रूप से इसके बारे में शिकायत करता है। – MSN

4

आप ऐसा कर सकता है:

static int f(int x, int y) { return (x+y); } 
static int g(int x, int y) { return (x*y); } 
#define A 1, 2 
#define B 2, 3 

आप एक सी संकलक है कि एक गैरमानक inline निर्देश समर्थित उपयोग कर रहे थे, तो आप एक समारोह कॉल की भूमि के ऊपर समाप्त कर सकता है। और यदि आप सी ++,

template<T> T f(T x, T y) { return (x+y); } 
template<T> t g(T x, T y) { return (x*y); } 
#define A 1, 2 
#define B 2, 3 

जो आपके इच्छित सी मैक्रो समाधान के समान ही काम करेगा।

तो f और g मैक्रो होना चाहिए, वहाँ सी पूर्वप्रक्रमक के साथ किसी भी तरह से एक वास्तविक अल्पविराम मंगलाचरण स्थल पर प्रदर्शित होने के बिना मैक्रो करने के लिए कई तर्क पारित करने के लिए नहीं है। ऐसा करने के लिए, आपको प्री प्रीप्रोसेसर स्तर सी प्रीप्रोसेसर से जोड़ना होगा।

#include<iostream> 
using namespace std; 

#define A 1, 2 

template <typename T> 
inline T f(T a, T b) { return a + b; } 

int main() 
{ 
    cout << f(A) << endl; 
    return 0; 
} 
+0

अच्छा समाधान। इसके अतिरिक्त, इनलाइन निर्देश के बिना भी, जब तक आप फ़ंक्शंस पर स्थिर निर्देश का उपयोग करते हैं, तब तक कंप्यूटर्स को अनुकूलित करने की संभावना स्वचालित रूप से इनलाइन हो जाएगी। –

+0

"एक गैर मानक मानक इनलाइन निर्देश"। उस मामले के लिए यदि यह मानक एक का समर्थन करता है, तो शायद यह इस सरल को कुछ रेखांकित करेगा।हम जानते हैं कि प्रश्नकर्ता सी 99 का उपयोग कर रहा है, क्योंकि उसके मुख्य समारोह में कोई रिटर्न स्टेटमेंट नहीं है, लेकिन संभावित रूप से परिभाषित व्यवहार का इरादा है ;-) –

0

हो सकता है कि यह तुम क्या चाहते है सी 8 9 और सी ++ मोड दोनों में यह यौगिक शाब्दिक वाक्यविन्यास।

+1

प्रश्न सी के बारे में है, है ना? –

4

आप C99 उपयोग कर रहे थे, तो आप compound initialiser syntax उपयोग कर सकते हैं एक सारिणी के रूप में कई तर्क पारित करके यह करने के लिए:

#define f(a) (a[0]+a[1]) 
#define g(a) (a[0]*a[1]) 
#define A ((int[]) {1, 2}) 
#define B ((int[]) {2, 3}) 

जीसीसी का समर्थन करता है

+0

थैक्स इसे सॉर्ट करने के लिए :) – mre

संबंधित मुद्दे