我正在做一个从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中,你会为这个写一个函数。替换
T
、U
和V
。正确的类型。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/