我需要使用CMacro实现类似的东西:
int a = //some constant;
int x = //constant
int c = //constant
int y = a*x+b;
我尝试过类似的事情:
#define A 3
#define X 6
#define B 8
#define Y ((A)*(X) + (B))
但是,如果我在gcc中使用标记-E
,则会显示3*6 + 8
。
在替换之前,我没有办法使用CMacro执行整数运算吗?
我的目的就像是一段代码......:
#define func_impl(NY,NX,R) \
void func_#NY_#NX(int* y, int* x) { \ //x size NX, y size NY
int tmp[2*NX - R]; \
for(int i = 0; i < 2*NX - R; i++) tmp[i] = 0; \
//other processing operations... \
}
我知道NX,NY和R先验,虽然它们是由另一个程序生成的。所以基本上我想避免让程序P1在可能的情况下生成太多的宏常量。
答案 0 :(得分:2)
但是如果我在gcc中使用-E标志它会显示3 * 6 + 8。
这实际上很好,因为任何体面的编译器都会对这样的表达式进行constant folding,所以你最终会在机器代码中得到26
。
除此之外,您可以尝试使用static inline
函数,它具有类型安全的优点。宏很容易出错,而且很难调试。
答案 1 :(得分:1)
不,宏只作为文本替代,没有别的。
预处理程序评估表达式的唯一位置是它自己的#if/#else
构造。但实际上它可能与你初看起来有点不同,因为整数的类型总是[u]intmax_t
。