我有一些如下的宏:
#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逻辑的最佳方法是什么,但它有效吗?并将所有常量保持为常量和整数?
答案 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,因此如果x
为7
,则(x*3)/2
将为10
而不是11
。根据您的需要,您可能希望(x*3 + 1)/2
确保充足MAX_LENGTH
。