c++ - एक PROTOTYPE मैक्रो का क्या मतलब है जो केवल अपने तर्कों को विस्तार देता है?




macros (2)

कुछ इस तरह की अनुमति देने के लिए मैक्रोज़ का उपयोग हेडर फ़ाइल में प्रोटोटाइप में किया जाएगा:

int foo PROTOTYPE((int bar));

यदि ANSI C का पता लगाया गया था ( __STDC__ को 1 के रूप में परिभाषित किया गया है), तो इसका विस्तार होगा:

int foo(int bar);

यदि ANSI C का पता नहीं लगाया गया है, तो इसका विस्तार होगा:

int foo();

सी के मानकीकरण से पहले जो आम था।

कुछ पुस्तकालय अभी भी ऐसा करते हैं; यदि आप tcpd.h में tcpd.h (यदि आपके पास उपलब्ध है), तो आप देखेंगे:

/* someone else may have defined this */
#undef  __P

/* use prototypes if we have an ANSI C compiler or are using C++ */
#if defined(__STDC__) || defined(__cplusplus)
#define __P(args)       args
#else
#define __P(args)       ()
#endif

यह इसे अच्छी तरह से समझाता है।

डबल कोष्ठक के रूप में, __P(arg1, arg2) एक सिंटैक्स त्रुटि देगा (मैक्रो के लिए कई तर्क पास कर रहा है), जबकि __P((arg1, arg2)) ठीक होगा (केवल कोष्ठक में संलग्न)।

यह GNU C. में गैर-GNU संकलक में __extension__((...)) समान है, बस #define __extension__(unused) में अर्ध-पोर्टेबल कोड है, जैसा कि केवल एक "तर्क" दिया गया है, कोष्ठक में लिपटा हुआ है।

मेरे पास एक हेडर फ़ाइल है जिसमें सम्‍मिलित है

#define PROTOTYPE(s) s

इस बात का क्या मतलब है? ऐसा लगता है कि यह सिर्फ इनपुट को खुद से बदल देगा।

इसके चारों ओर अन्य निर्देशों के #ifndef PROTOTYPE , लेकिन केवल एक ही है जो किसी भी असर की जाँच करने के लिए प्रकट होता है यदि यह परिभाषित किया गया है: #ifndef PROTOTYPE । मुझे HDF4 हेडर फ़ाइलों में कुछ स्थान मिले जो ऐसा करते हैं: #define PROTOTYPE । इसलिए, इनमें से कोई भी मेरे सवाल को स्पष्ट नहीं करता है। अभी भी बहुत बेकार लगता है।

यहाँ इसका उपयोग कैसे किया जाता है:

CS_RETCODE clientmsg_callback PROTOTYPE((
CS_CONTEXT * context,
CS_CONNECTION *connection,
CS_CLIENTMSG *clientmsg));

यह एक प्रोजेक्ट का हिस्सा है जो Sybase Open Client का उपयोग करता है। बाद में यहाँ प्रयोग किया जाता है:

ct_callback(context, NULL, CS_SET, CS_CLIENTMSG_CB,
                  (CS_VOID *)clientmsg_callback);

मैं यहाँ से एक नमूना कार्यक्रम से जा रहा हूँ:

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc35570.1570/html/clcprgde/clcprgde10.htm

clientmsg_callback को बाद में लागू किया गया है। मुझे लगता है कि नमूना मूल रूप से C ++ के बजाय C को ध्यान में रखकर लिखा गया था। शायद इसके साथ कुछ करना है?


पुराने दिनों में वापस, वास्तव में शुरुआती सी, एक प्रोटोटाइप जैसी कोई चीज नहीं थी। फ़ंक्शन के कोष्ठकों के बाद फ़ंक्शन तर्क सूची इस तरह से आई :

square(x)
int x;
{
int y = x * x;
return y;
}

इन दिनों, बेशक, तर्क कोष्ठक के अंदर जाते हैं:

square(int x)
{
int y = x * x;
return y;
}

"लापता" रिटर्न प्रकार पर ध्यान दें; C फ़ंक्शंस का उपयोग अंतरिम रूप से रिटर्न int करने के लिए किया जाता था, और यह केवल तभी होता था जब आपको एक अलग रिटर्न प्रकार की आवश्यकता होती थी, जो आपको यह कहना था कि यह क्या था।

समारोह घोषणाओं में अभी तक नियमों का एक और सेट था। K & R C (प्राचीन संस्करण) में एक फ़ंक्शन घोषणा में कोई तर्क नहीं था:

int square();

और ANSI C में फ़ंक्शन प्रोटोटाइप में तर्कों की एक सूची है:

int square(int x);

संक्रमण के दौरान, लोगों ने निराला मैक्रोज़ का उपयोग किया ताकि वे दोनों तरीकों को संकलित कर सकें:

int square(PROTOTYPE(int x));

साथ में

#define PROTOTYPE(s)

यह पहले संस्करण तक विस्तारित होगा।

साथ में

#define PROTOTYPE(s) s

इसका विस्तार दूसरे तक होगा।

प्रश्न में कोड में "अतिरिक्त" कोष्ठक के संबंध में, तर्क सूची में एक से अधिक तर्क होने पर उनकी आवश्यकता होती है। उनके बिना, मैक्रो इनवोकेशन में एक से अधिक तर्क होते हैं, इसलिए केवल एक तर्क के साथ परिभाषित मैक्रो से मेल नहीं होगा:

PROTOTYPE(int x, int y)   // error: too many arguments
PROTOTYPE((int x, int y)) // ok: only one argument (enclosed in parentheses)




macros