【问题标题】:C macro with flexible argument具有灵活参数的 C 宏
【发布时间】:2015-07-11 06:52:49
【问题描述】:

我需要做类似的事情:

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

#define INCR(count,ARGS...) \
   if(ARGS) \
   count++; \

void main()
{
    int count =1;
    int flag =1;
    INCR(count);
    printf("count %d",count);
    INCR(count,flag); /* flag determines if the count is to be incremented or not */
    printf("count %d",count);
}

我收到以下错误:

sh-4.3$ gcc -o main*.c main.c:在函数'main'中: main.c:6:8: 错误: ')' 标记之前的预期表达式 如果(ARGS)\ ^ main.c:15:5:注意:在宏“INCR”的扩展中 增量(计数); ^ sh-4.3$

这里的计数器应该只在标志存在时才增加。我需要一个参数数量灵活的宏。请帮我解决这个问题

【问题讨论】:

  • 请记住,行尾的`\`字符是行继续字符,表示当前行将与下一行连接为单行.
  • 另外我怀疑你想用可执行程序覆盖源文件,所以我建议你在 actual 程序的-o 之后添加一个额外的参数 go gcc .
  • 您希望 INCR(count) 的预处理代码是什么样的?
  • 了解这个要求就好了
  • 顺便说一句,this variadic macro reference 可能会有所帮助。

标签: c gcc macros


【解决方案1】:

基于https://stackoverflow.com/a/11763277/5085250 中的示例,您可以执行以下操作:

#define GET_MACRO(_1,_2,NAME,...) NAME
#define INCR(...) GET_MACRO(__VA_ARGS__, INCR2, INCR1)(__VA_ARGS__)

#define INCR1(count)\
count++;

#define INCR2(count,flag)\
if(flag)count++;

这里我假设如果没有给出标志,你想增加。如果您不想在这种情况下增加,则需要修改 INCR1 部分...

【讨论】:

  • 很好,但是我得到以下编译时错误:错误:VA_ARGS 只能出现在 C99 可变参数宏 [-Werror]的扩展中>
  • gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html 中有一条关于该问题的兼容性的评论:“如果您关心到 GCC 早期版本的可移植性,您应该只使用命名变量参数。另一方面,如果您关心到其他符合 C99 实现的可移植性,您应该只使用 VA_ARGS。"您可以尝试用示例中的命名参数替换 VA_ARGS
  • 或者你可以尝试在编译选项中添加-std=c99,如果你的设置可以的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
相关资源
最近更新 更多