2014-11-20 4 views
9

क्या हम मैक्रो पैरामीटर के लिए डिफ़ॉल्ट पैरामीटर मान निर्दिष्ट कर सकते हैं?क्या सी/सी ++ प्रीप्रोसेसर मैक्रोज़ में डिफ़ॉल्ट पैरामीटर मान हो सकते हैं?

मुझे पता है कि कोई प्रकार की जांच नहीं है, इसलिए मुझे उम्मीद है कि डिफ़ॉल्ट मान प्रीप्रोसेसर द्वारा उपयोग किए गए कुछ पाठों से कुछ और नहीं होना चाहिए, जहां पैरामीटर मान निर्दिष्ट नहीं है।

+0

@ 2501 मेरा मानना ​​है कि उत्तर प्रभावी रूप से वही है लेकिन वे सटीक डुप्लिकेट नहीं हैं –

+0

नहीं। वैसे भी, प्रीप्रोसेसर जितना जटिल है उतना जटिल है ;-) – Cameron

+3

मुझे लगता है कि यह वही है जो आप ढूंढ रहे हैं: [डिफ़ॉल्ट तर्क सी 99 के लिए] (http://gustedt.wordpress.com/2010/06/03/default-arguments-for-c99/) – 101010

उत्तर

1

यह सबसे सरल समाधान की तरह लगता है एक अतिरिक्त मैक्रो डिफ़ॉल्ट पैरामीटर गुम है परिभाषित करने के लिए है।

#define MACRO1(PARAM1 , PARAM2) &(PARAM1 + PARAM2) // or whatever logic 

#define MACRO1_DEFAULT(PARAM1) MACRO1 (PARAM1 , 12) // PARAM2 default of 12 

इसके अलावा, जैसा 40two से उल्लेख किया है, भाषा variadic macros के लिए एक अंडाकार है, जो भी कुछ मामलों में एक व्यवहार्य समाधान हो सकता है उपयोग करने का समर्थन करता है। लिंक किए गए लेख के

सामग्री:

variadic मैक्रो समारोह की तरह मैक्रो कि बहस के परिवर्तनशील होते हैं।

variadic मैक्रो का उपयोग करने के लिए, अंडाकार एक मैक्रो परिभाषा अंतिम औपचारिक तर्क के रूप में निर्दिष्ट किया जा सकता है, और प्रतिस्थापन पहचानकर्ता __VA_ARGS__ अतिरिक्त तर्क डालने के लिए परिभाषा में इस्तेमाल किया जा सकता है।
__VA_ARGS__ उन सभी तर्कों द्वारा प्रतिस्थापित किया गया है जो इलिप्सिस से मेल खाते हैं, जिनमें उनके बीच अल्पविराम शामिल है।

सी स्टैंडर्ड निर्दिष्ट करता है कि कम से कम एक तर्क अंडाकार को भेजे जाने चाहिए, यह सुनिश्चित करें कि मैक्रो पीछे अल्पविराम के साथ एक अभिव्यक्ति को हल नहीं होती है।

<Microsoft specific>
विजुअल C++ कार्यान्वयन एक अनुगामी अल्पविराम को दबाने कोई तर्क अंडाकार को पास किया जाता है, तो होगा।
</Microsoft Specific>

उदाहरण

// variadic_macros.cpp 
#include <stdio.h> 
#define EMPTY 

#define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); } 
#define CHECK2(x, ...) if ((x)) { printf(__VA_ARGS__); } 
#define CHECK3(...) { printf(__VA_ARGS__); } 
#define MACRO(s, ...) printf(s, __VA_ARGS__) 

int main() { 
    CHECK1(0, "here %s %s %s", "are", "some", "varargs1(1)\n"); 
    CHECK1(1, "here %s %s %s", "are", "some", "varargs1(2)\n"); // won't print 

    CHECK2(0, "here %s %s %s", "are", "some", "varargs2(3)\n"); // won't print 
    CHECK2(1, "here %s %s %s", "are", "some", "varargs2(4)\n"); 

    // always invokes printf in the macro 
    CHECK3("here %s %s %s", "are", "some", "varargs3(5)\n"); 

    MACRO("hello, world\n"); 

    MACRO("error\n", EMPTY); // would cause error C2059, except VC++ 
          // suppresses the trailing comma 
} 

आउटपुट

here are some varargs1(1) 
here are some varargs2(4) 
here are some varargs3(5) 
hello, world 
error 
5

यह करने के लिए एक तरीका होता है, आप एक असामान्य वाक्य रचना की अनुमति यदि:

#include <stdio.h> 
#include <stdint.h> 
#include <stdlib.h> 

void TestInternal(int n) 
{ 
    printf("%d\n" , n) ; 
} 
#define TestGet(f , ...) f 
#define Test(...) TestInternal(TestGet(__VA_ARGS__ DEFAULT , DEFAULT)) 
#define DEFAULT 100 

int main(void) 
{ 
    Test() ; 
    Test(12345 ,) ; 

return 0 ; 
} 

यह प्रकार सुरक्षित है और किसी भी तर्क के लिए विस्तारित किया जा सकता है।

ध्यान दें कि अल्पविराम वर्तमान यदि आप एक चर पारित किया जाना चाहिए। आप इसे एक संकेतक के रूप में देख सकते हैं कि इस फ़ंक्शन/मैक्रो में डिफ़ॉल्ट पैरामीटर हैं।

एक समान संस्करण का उपयोग आप अल्पविराम छोड़ सकते हैं, लेकिन फिर अपने कार्यों कम से कम एक गैर-डिफ़ॉल्ट पैरामीटर जो पहले होना चाहिए होना आवश्यक है।

12

आप किसी मैक्रो अधिभार व्यवस्था है जिसके उदा में प्रदान की जाती है के लिए देख रहे हैं Boost.PP's facilities

#define VARGS_(_10, _9, _8, _7, _6, _5, _4, _3, _2, _1, N, ...) N 
#define VARGS(...) VARGS_(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) 

#define CONCAT_(a, b) a##b 
#define CONCAT(a, b) CONCAT_(a, b) 

और

#define MACRO_2(a, b) std::cout << a << ' ' << b; 

#define MACRO_1(a) MACRO_2(a, "test") // Supply default argument 

#define MACRO(...) CONCAT(MACRO_, VARGS(__VA_ARGS__))(__VA_ARGS__) 

Demo:

#define MACRO_2(a, b) std::cout << a << ' ' << b; 

#define MACRO_1(a) MACRO_2(a, "test") // Supply default argument 

// Magic happens here: 

#define MACRO(...) BOOST_PP_OVERLOAD(MACRO_, __VA_ARGS__)(__VA_ARGS__) 

Demo. तर्क की संख्या मैक्रो का नाम, जो आसानी से बूस्ट के बिना लागू किया जा सकता के रूप में इस के साथ concatenated है।

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