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

#include <stdio.h>
#include <stdarg.h>

#define CONN_DISALLOW 3201008
#define SYSLOG_CONN_DISALLOW  \
    "%d: Disallowing new connections. Reason: %s.\n", CONN_DISALLOW

void cp_syslog(int syslogid, ...);

void cp_syslog(int syslogid, ...)
{
        char *syslog_disallow;
        va_list ap;
        va_start(ap, syslogid);

        syslog_disallow = va_arg(ap, char *);

        printf("String is %s", syslog_disallow);
        printf("Macro is %s", SYSLOG_CONN_DISALLOW);

        va_end(ap);
}

int main()
{
        int id = 2;
        cp_syslog(id, SYSLOG_CONN_DISALLOW);
        return 0;
}

अब आउटपुट इस प्रकार मिला:

String is %d: Disallowing new connections. Reason: %s.
Macro is %d: Disallowing new connections. Reason: %s.

उम्मीद के रूप में:

String is SYSLOG_CONN_DISALLOW

यहां मेरी अपेक्षा यह है कि किसी विशेष मैक्रो को कैसे संसाधित किया जाए यदि विभिन्न मैक्रोज़ को एक ही वैरिएड फ़ंक के वैकल्पिक तर्क के रूप में पारित किया जाता है।

नीचे की तरह:

cp_syslog(id, SYSLOG_CONN_DISALLOW);
cp_syslog(id, SYSLOG_CONN_ALLOW);
cp_syslog(id, SYSLOG_ICMP_DISALLOW);
0
renga_in_stack 22 अप्रैल 2020, 19:09

1 उत्तर

सबसे बढ़िया उत्तर

पहली संभावना बस करना है

cp_syslog(id, "SYSLOG_CONN_DISALLOW");

क्रियान्वयन :

pi@raspberrypi:/tmp $ ./a.out
String is SYSLOG_CONN_DISALLOWMacro is %d: Disallowing new connections. Reason: %s.
pi@raspberrypi:/tmp $ 

(पहले printf में एक नई पंक्ति छूट जाती है या cp_syslog(id, "SYSLOG_CONN_DISALLOW\n") करते हैं)

लेकिन यह कृत्रिम है और यहां तक ​​कि cp_syslog की परिभाषा भी कृत्रिम है क्योंकि वह जानता है कि मैक्रो SYSLOG_CONN_DISALLOW इसकी परिभाषा में है।


यदि आप मैक्रो के नाम और उसके 'मान' दोनों को 'कुछ और' देना चाहते हैं तो बस एक मध्यवर्ती मैक्रो का उपयोग करें जैसे:

#define NAME_VALUE(x) #x, x

NAME_VALUE(SYSLOG_CONN_DISALLOW) का विस्तार "SYSLOG_CONN_DISALLOW", "%d: Disallowing new connections. Reason: %s.\n", 3201008 है

उस समय cp_syslog को यह जानने की जरूरत नहीं है कि यह SYSLOG_CONN_DISALLOW पर लागू होता है:

#include <stdio.h>
#include <stdarg.h>

#define CONN_DISALLOW 3201008
#define SYSLOG_CONN_DISALLOW  \
    "%d: Disallowing new connections. Reason: %s.\n", CONN_DISALLOW

#define NAME_VALUE(x) #x, x /* ADDED */

void cp_syslog(int syslogid, ...);

void cp_syslog(int syslogid, ...)
{
  char *syslog_disallow;
  va_list ap;
  va_start(ap, syslogid);

  syslog_disallow = va_arg(ap, char *);

  printf("String is %s\n", syslog_disallow); /* \n ADDED */
  printf("Macro is %s", va_arg(ap, char *)); /* MODIFIED */

  va_end(ap);
}

int main()
{
        int id = 2;
        cp_syslog(id, NAME_VALUE(SYSLOG_CONN_DISALLOW)); /* MODIFIED */
        return 0;
}

संकलन और निष्पादन:

pi@raspberrypi:/tmp $ gcc pp.c
pi@raspberrypi:/tmp $ ./a.out
String is SYSLOG_CONN_DISALLOW
Macro is %d: Disallowing new connections. Reason: %s.
pi@raspberrypi:/tmp $ 
1
bruno 22 अप्रैल 2020, 20:02