我希望在编译期间通过简单的+ - *和/操作来定义一个常量整数。我使用const double XMIN = ..
尝试了这个,但这不允许在右侧使用其他常量。所以我不能做出以下定义:
#define SEED_GRAIN 1e5
#define XMIN -0.2f
#define XMAX 0.2f
#define XLENGTH (XMAX-XMIN)
#define XRAND ((XLENGTH*SEED_GRAIN)+1)
作为随机数的区间数的先验计算,我使用如下:
x = rand()%(int)XRAND;
x = pt.x/SEED_GRAIN + XMIN;
这适用于Mac上的某些C编译器,但Windows SDK以下列方式抱怨(int)XRAND
行:
error C2105: '--' needs l-value
error C2143: syntax error : missing ')' before 'constant'
我想所有这些都可以通过常量而不是那些丑陋的编译器定义来完成,但我还没有深入理解何时将某些东西视为编译器的常量表达式。有人可以指导我找到一个干净的解决方案吗?
Fwiw我在matlab中编译了一个mex文件,正如所解释的那样,它可以在mac上运行标准编译器和mex -O CFLAGS='\$CFLAGS -std=c11' main.c
,但拒绝在带有sdk 7.1的windows下编译
答案 0 :(得分:4)
原因是(XMAX-XMIN)
将扩展为(XMAX--0.2f)
,然后--
被视为运算符,而不是- -0.2f
。
答案 1 :(得分:1)
在将#define
s与<{1}}一起使用时,将整数和浮点文字放在括号中。
#define SEED_GRAIN (1e5)
#define XMIN (-0.2f)
#define XMAX (0.2f)
或者你可以做
const double sees_grain = 1e5;
const double xmin = -0.2f;
const double xmax = 0.2f;
如果需要在全球范围内为其他两个人提供它们,那么就无法做到:
#define XLENGTH (xmin - xmax)
#define XRAND ((XLENGTH * seed_grain) + 1.)
只需通过执行
在运行时定义和初始化它们double xlength = 0.;
double xrand = 0.;
int main(void)
{
xlength = xmin - xmax;
xrange = (xrange * seed_grain) + 1.;
...