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

标签 c macros p99

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

#define MAC(a,b,c) ???

扩展例如

MAC(1,2,1)

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

<小时/>

根据下面的建议,我构建了一个示例,该示例基本上可以使用 p99 完成我想要的操作,包括:

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

最佳答案

如果您的参数始终是小十进制数字,如您的示例所示,您可以摆脱我在 P99 中提供的内容。 。它具有像 P99_IF_EQ 这样的宏,您可以将其用作

#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 时扩展该声明。显然,对于三个不同的参数,这已经变得有点乏味,但是是可行的。

关于C 宏删除参数列表中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13836949/

相关文章:

c++ - 如何部署C静态库: header + c file or object file?

c - 对于 mmaped 结构,静态数组更改为动态

c++ - 根据平台目标修改 OriginalFilename 字符串

c++ - C++11 中的 P99_FOR

web-services - 什么是 P99 延迟?

n X n 矩阵的行列式代码

c - 将参数传递给另一个 .c 文件

c++ - 在大型模板参数列表的情况下宏的便利性

c++ - 如何编写调试宏以在 C++ 中打印函数(strace 样式)的所有参数?