【发布时间】:2020-04-22 16:09:57
【问题描述】:
我有以下程序。它将宏作为可选参数传递给可变参数函数。在该函数定义中,我们是否能够在不扩展的情况下获得该宏。我已将类型用作 '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);
【问题讨论】:
-
嗯。宏得到扩展,这就是它们的用途。预处理后,宏名称从源代码中消失。您可以将宏的名称传递为
"SYSLOG_CONN_DISALLOW"以获得您想要的,但它看起来不像您真正想要的。显然您正试图拥有一个错误代码和相关消息系统。 -
@M Oehm 和@bruno:我明白你使用
"SYSLOG_CONN_DISALLOW"的意义。但是我不允许像上面那样发送宏。因为有将近 400-500 个不同的宏作为 arg 传递给cp_syslog()。通过这种编程,任何可能都可以提取宏名称。 -
函数
cp_syslog是否总是像您的示例中那样调用:syslog(id, macro)?如果是这样,则不需要可变参数,但可以将cp_syslog包装在字符串化宏中。 -
@renga_in_stack 我编辑了我的答案
-
@bruno :感谢您提供帮助并确认宏中的一些内容。
标签: c c-preprocessor variadic-functions variadic-macros