C++预处理器__VA_ARGS__参数数量

130

我在网络上找不到答案的一个简单问题。在可变参数宏中,如何查找参数的数量?如果使用boost预处理器有解决方案,那就没问题了。

如果这有所区别,我正在尝试将不定数目的宏参数转换为boost预处理器序列、列表或数组进行进一步处理。


只是为了明确 - 你是在问关于可变参数宏,而不是用于创建可变参数 C 函数的宏吗? - anon
2
参数类型是否相同?如果是,并且类型已知,则可以使用复合字面量的标准C解决方案;如果未知,您可以使用__typeof__来使其在某些编译器上工作。 - Christoph
1
由于讨论涉及到 Boost 预处理器序列等内容,因此必须使用 C++(这就是为什么我重新标记了 Q - 但未更改问题标题的原因)...糟糕;我会修复它。 - Jonathan Leffler
@JonathanLeffler 不错,Boost是一个C++库。不过,Boost.Preprocessor可以与C一起使用。据我所知,它使用的所有内容都不特定于C++。 - Justin
相关:https://dev59.com/92gt5IYBdhLWcg3w3xEw#26408195 - Gabriel Staples
12个回答

1

@CarloWood 的确如此。预处理器实际上没有“零参数”的概念。我们所谓的“零参数”在预处理器中是“一个空参数”。但是可以使用 C++20 的 __VA_OPT__ 或编译器扩展的 ##__VA_ARGS__ 来修复它,删除先前的逗号,例如:https://godbolt.org/z/X7OvnK - Justin

0

你可以将字符串化并计算令牌:

int countArgs(char *args)
{
    int result = 0;
    int i = 0;
         
    while (isspace(args[i])) 
        ++i;
    if (args[i]) 
        ++result;
     
    while (args[i++]) 
    {
        if (args[i] == ',') 
            ++result;
        else if (args[i] == '\'') 
            i += 2;
        else if (args[i] == '\"') 
            while (args[i++]) 
                if (args[i + 1] == '\"' && args[i] != '\\') 
                    break;
    }
 
    return result;
}

#define MACRO(...) \
{ \
    int count = countArgs(#__VA_ARGS__); \
    printf("NUM ARGS: %d\n",count); \
}

2
刚刚查看了这个答案的待编辑状态 - 看起来你可能有两个账户。如果你坚持使用一个账户,就可以自由编辑自己的帖子而不需要等待审核。 - J Richard Snape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接