先验常数计算

时间:2016-03-13 11:13:21

标签: c matlab mex

我希望在编译期间通过简单的+ - *和/操作来定义一个常量整数。我使用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下编译

2 个答案:

答案 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.;

  ...