是否有可能使用va_arg将宏作为可选参数传递给可变参数函数>

问题描述 投票:0回答:1

我有以下程序。它将宏作为可变参数传递给可选arg。在该函数定义内,我们能否在不扩展的情况下获取该宏。我已将类型用作'char *',并显示了宏扩展字符串。任何获取宏的方法都是如此。

#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);

我有以下程序。它将宏作为可变参数传递给可选arg。在该函数定义内,我们能否在不扩展的情况下获取该宏。我已将类型用作'char *'和...

c c-preprocessor variadic-functions variadic-macros
1个回答
0
投票

第一种可能就是做

© www.soinside.com 2019 - 2024. All rights reserved.