宏常量中的浮点数学,同时保持整数

时间:2013-11-20 02:34:53

标签: c macros

我有一些如下的宏:

#define THING_LENGTH (512)
#define MAX_COUNT (4096*8)
#define MAX_LENGTH ((int32)((float)(MAX_COUNT*THING_LENGTH)*1.5))

在此代替:

typedef struct Writes {
    char buf[MAX_LENGTH];
    char buf2[MAX_COUNT];
    ...
} Writes;

要提供此预处理结果:

typedef struct Writes {
    char buf[((int32)((float)((4096*8)*(512))*1.5))];
    char buf2[(4096*8)];
    ...
} Writes;

这给了我这个警告/错误:

variably modified ‘buf’ at file scope

在宏中保持MAX_COUNT * THING_LENGTH * 1.5逻辑的最佳方法是什么,但它有效吗?并将所有常量保持为常量和整数?

2 个答案:

答案 0 :(得分:2)

只是不要在常量的数学运算中使用任何浮点数。这里:

//---mul by 3, then div by 2
#define MAX_LENGTH ((MAX_COUNT*THING_LENGTH * 3) / 2 )

//---more optimized version
#define MAX_LENGTH_PARTIAL (MAX_COUNT*THING_LENGTH)
#define MAX_LENGTH (((MAX_LENGTH_PARTIAL << 1 ) + MAX_LENGTH_PARTIAL) >> 1 )

答案 1 :(得分:2)

这个问题多次重复。

问题是: 1.浮点常数不考虑常量用于确定数组大小和/或
2.数组大小来自变量。 (但不是在这个OP的情况下)

注意:请记住,使用(x*3)/2惯用语而不是(x*1.5)会截断为0,因此如果x7,则(x*3)/2将为10而不是11。根据您的需要,您可能希望(x*3 + 1)/2确保充足MAX_LENGTH