作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑下面的宏。如何使用宏展开 for 循环并将大量宏干净地导出到可读的 header 中?
宏.h
#define ARR(n) \
typedef int arr##n[n]; \
void arr##n##_add(arr##n res, arr##n x, arr##n y){ \
int i = 0; \
for (; i < n; i++) { \
res[i] = x[i] + y[i]; \
} \
}
ARR(3)
ARR(4)
通过预处理器使用 gcc -E -P macro.h > out.h
运行它我们得到:
out.h
typedef int arr3[3];
void arr3_add(arr3 res, arr3 x, arr3 y){
int i = 0;
for (; i < 3; i++) {
res[i] = x[i] + y[i];
}
}
typedef int arr4[4];
void arr4_add(arr4 res, arr4 x, arr4 y){
int i = 0;
for (; i < 4; i++) {
res[i] = x[i] + y[i];
}
}
使用token pasting像上面一样,我们避免重复定义。现在有两件事我想知道:
如何每个 for(;i; i < n)
替换(展开)为例如:
res[0] = x[0] + y[0];
res[1] = x[1] + y[1];
...
res[n] = x[n] + y[n];
将大量宏黑客行为导出到可读 header 中的干净方法是什么?我应该在我的 make
中创建一个 shell 函数吗?文件将最终 header 导出到 include
目录?
也许有更好的方法可以做到这一点。欢迎任何替代方案。
最佳答案
这是 answer 引用的一种可能的解决方案使用these macro functions :
#define ARR(n, m) \
static inline void vec##n##_add(vec##n res, \
vec##n const u, vec##n const v) { \
m }
#define ADD(i, n) res[i] = u[i] + v[i];
ARR(3, EVAL(REPEAT(3, ADD, ~)))
ARR(4, EVAL(REPEAT(4, ADD, ~)))
它按照要求执行,但以一种复杂、黑客、丑陋的方式......特别是,使用递归宏来执行应该是迭代的操作。
关于c - 替换 For 循环的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34247892/
我是一名优秀的程序员,十分优秀!