先验常数计算

a priori constant calculation

我想定义一个常量整数作为编译期间简单的 +-* 和/ 操作的结果。我尝试使用 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 但拒绝在 windows 下使用 sdk 7.1

进行编译

#defines 中使用整数和浮点数时,将它们放在括号中。

#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.)

of 只需在 运行 时间通过

定义和初始化它们
double xlength = 0.;
double xrand = 0.;

int main(void)
{ 
  xlength = xmin - xmax;
  xrange = (xrange * seed_grain) + 1.;

  ...

原因是 (XMAX-XMIN) 将扩展为 (XMAX--0.2f),然后 -- 被视为运算符而不是 - -0.2f