CMacro和整数运算

时间:2016-05-16 10:47:51

标签: c arithmetic-expressions preprocessor-directive

我需要使用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在可能的情况下生成太多的宏常量。

2 个答案:

答案 0 :(得分:2)

  

但是如果我在gcc中使用-E标志它会显示3 * 6 + 8。

这实际上很好,因为任何体面的编译器都会对这样的表达式进行constant folding,所以你最终会在机器代码中得到26

除此之外,您可以尝试使用static inline函数,它具有类型安全的优点。宏很容易出错,而且很难调试。

答案 1 :(得分:1)

不,宏只作为文本替代,没有别的。

预处理程序评估表达式的唯一位置是它自己的#if/#else构造。但实际上它可能与你初看起来有点不同,因为整数的类型总是[u]intmax_t