首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C宏删除参数列表中的重复项

C宏删除参数列表中的重复项
EN

Stack Overflow用户
提问于 2012-12-12 09:46:08
回答 1查看 349关注 0票数 0

我想知道是否有可能构建一个gnu C宏,它扩展为一个标记列表(整数),这些标记(整数)是宏的参数,没有重复。论点的数目可以假定是固定的(暂时)。我想要这样的东西:

代码语言:javascript
复制
#define MAC(a,b,c) ???

它扩展了。

代码语言:javascript
复制
MAC(1,2,1)

1,2。参数没有排序,结果也不必排序。

基于下面的建议,我构建了一个示例,它本质上实现了使用p99所需的功能,包括:

代码语言:javascript
复制
#include <p99/p99_if.h>
#include <p99/p99_paste.h>

#define MAC2(a,b) double P99_PASTE2(myvar_, a) P99_IF_EQ(a,b)()(; double P99_PASTE2(myvar_, b))
#define MAC3(a,b,c) double P99_PASTE2(myvar_, a) P99_IF_EQ(a,b)()(; double P99_PASTE2(myvar_, b)) P99_IF_EQ(a,c)()(P99_IF_EQ(b,c)()(; double P99_PASTE2(myvar_, c)) )

MAC2(1,2);
MAC2(3,3);

MAC3(1,2,3);
MAC3(10,10,1);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-12 10:42:42

如果您的参数总是很小的十进制数,就像在您的示例中一样,您可以不使用我在P99中提供的内容。它有像P99_IF_EQ这样的宏,可以用作

代码语言:javascript
复制
#define MAC(A,B) unsigned P99_PASTE2(myvar_, A) P99_IF_EQ(A,B)()(; unsigned P99(unsigned P99_PASTE2(myvar_, B))

MAC(1,2); // -> myvar_1 and myvar_2
MAC(3,3); // -> myvar_3

仅在不等于B的情况下展开A的声明。显然,对于三个不同的论点,这已经变得有点乏味,但将是可行的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13836949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档