2016-01-06 83 views
1

我正在做一個代碼從gsl數字庫中的C頭文件轉換爲linux下的D的ubuntu。我想知道宏是什麼:C宏gsl庫代碼轉換爲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

你能否提供第二個樣本用法?也許從相應的* .c *文件。 –

+0

if(GSL_RANGE_COND(1)){...} // gsl_matrix_complex_double.h –

+0

hmm看起來像一個可能別名的謂詞GSL_RANGE_COND = bool函數(int x) –

回答

1
/* 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,UV。與正確的類型。

T GSL_FN_EVAL(U* F, V x) { return F.function(x, F.params); } 
+0

有趣。看起來好像C中的預處理器允許你在沒有指定返回和參數類型的情況下離開。這是真的?我想D有模板,但C的預處理器技術看起來很有趣。 –

+0

@DataPulverizer由於它只是文本替換,處理器沒有類型的概念。這實際上使它非常危險; D函數/模板提供了宏的大部分功能,同時也增加了類型安全性。 –

+0

只記得D已經混合了https://dlang.org/mixin.html,它們與C預處理器具有類似的功能。 –