我正在做一个从gsl数字库中的C头文件到linux下的D的代码转换。我想知道宏:

/* 1 */ #define GSL_VAR extern // gsl types.h file
/* 2 */ #define GSL_RANGE_COND(x) (x) // gsl_inline.h file
/* 3 */ #define GSL_FN_EVAL(F,x) (*((F)->function))(x,(F)->params)

去吧。
我怀疑特别是GSL_VAR给我带来了一些问题。其使用的一个例子是
GSL_VAR const gsl_rng_type *gsl_rng_borosh13; //gsl_rng.h

我把它变成
gsl_rng_borosh13 const(gsl_rng_type)*; // D Code

这是正确的做法吗?

最佳答案

/* 1 */ #define GSL_VAR extern // gsl types.h file

如果将C代码转换为D,则可以完全删除,因为D使用模块。如果您正在编写绑定,那么应该使用extern(C)
/* 2 */ #define GSL_RANGE_COND(x) (x) // gsl_inline.h file

这是身份函数。在D中,您可以编写函数而不是使用宏(例如int GSL_RANGE_COND(int x) { return x; })。但是,我认为编译时标志将改变这个宏的行为;在D中,您将使用version语句。
/* 3 */ #define GSL_FN_EVAL(F,x) (*((F)->function))(x,(F)->params)

同样,在D中,你会为这个写一个函数。替换TUV。正确的类型。
T GSL_FN_EVAL(U* F, V x) { return F.function(x, F.params); }

关于c - C宏将gsl库代码转换为D,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34633486/

10-11 18:36