Thread overview | |||||
---|---|---|---|---|---|
|
January 06, 2016 noob in c macro preprocessor hell converting gsl library header files | ||||
---|---|---|---|---|
| ||||
I have been converting C numeric libraries and depositing them here: https://github.com/dataPulverizer. So far I have glpk and nlopt converted on a like for like c function basics. I am now stuck on the gsl library, primarily because of the preprocessor c code which I am very new to. The following few are particularly baffling to me: #define INLINE_FUN extern inline // used in gsl_pow_int.h: INLINE_FUN double gsl_pow_2(const double x) { return x*x; } Could I just ignore the INLINE_FUN and use alias for function pointer declaration? For example ... alias gsl_pow_2 = double gsl_pow_2(const(double) x); #define INLINE_DECL // used in interpolation/gsl_interp.h: INLINE_DECL size_t gsl_interp_bsearch(const double x_array[], double x, size_t index_lo, size_t index_hi); I would guess the same as for INLINE_FUN? #define GSL_VAR extern // used in rng/gsl_rng.h:GSL_VAR const gsl_rng_type *gsl_rng_borosh13; perhaps GSL_VAR can be ignored and I could use: gsl_rng_borosh13 const(gsl_rng_type)*; I have been using these kind of fixes and have not been able to get the rng module to recognise the ported functions, meaning that something has been lost in translation. I am currently getting the following error: $ gsl_rng_print_state rng_example.o: In function `_Dmain': rng_example.d:(.text._Dmain+0x13): undefined reference to `gsl_rng_print_state' collect2: error: ld returned 1 exit status I can't seem to call any of the functions but the types are recognized. Thanks in advance |
January 06, 2016 Re: noob in c macro preprocessor hell converting gsl library header files | ||||
---|---|---|---|---|
| ||||
Posted in reply to data pulverizer | On Wednesday, 6 January 2016 at 13:36:03 UTC, data pulverizer wrote: > I have been converting C numeric libraries and depositing them here: https://github.com/dataPulverizer. So far I have glpk and nlopt converted on a like for like c function basics. I am now stuck on the gsl library, primarily because of the preprocessor c code which I am very new to. The following few are particularly baffling to me: > > #define INLINE_FUN extern inline // used in gsl_pow_int.h: INLINE_FUN double gsl_pow_2(const double x) { return x*x; } > > Could I just ignore the INLINE_FUN and use alias for function pointer declaration? For example ... > > alias gsl_pow_2 = double gsl_pow_2(const(double) x); Yes, you should be able to ignore INLINE_FUN double gsl_pow_2(const double x); is the correct declaration. > #define INLINE_DECL // used in interpolation/gsl_interp.h: INLINE_DECL size_t gsl_interp_bsearch(const double x_array[], double x, size_t index_lo, size_t index_hi); > > I would guess the same as for INLINE_FUN? yes > #define GSL_VAR extern // used in rng/gsl_rng.h:GSL_VAR const gsl_rng_type *gsl_rng_borosh13; > > perhaps GSL_VAR can be ignored and I could use: > > gsl_rng_borosh13 const(gsl_rng_type)*; It should be extern gsl_rng_type* gsl_rng_borosh13; > I have been using these kind of fixes and have not been able to get the rng module to recognise the ported functions, meaning that something has been lost in translation. > > I am currently getting the following error: > > $ gsl_rng_print_state > > rng_example.o: In function `_Dmain': > rng_example.d:(.text._Dmain+0x13): undefined reference to `gsl_rng_print_state' > collect2: error: ld returned 1 exit status > > I can't seem to call any of the functions but the types are recognized. > > Thanks in advance I think you might have some confusion between function declarations: T myFunction(Q myArg); function pointer type declarations: alias MyFunctionPointerType = T function(Q myArg); and function pointer declarations: MyFunctionPointerType myFunctionPointer; |
January 06, 2016 Re: noob in c macro preprocessor hell converting gsl library header files | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Wednesday, 6 January 2016 at 13:59:44 UTC, John Colvin wrote: >> #define INLINE_FUN extern inline // used in gsl_pow_int.h: INLINE_FUN double gsl_pow_2(const double x) { return x*x; } >> >> Could I just ignore the INLINE_FUN and use alias for function pointer declaration? For example ... >> >> alias gsl_pow_2 = double gsl_pow_2(const(double) x); > > Yes, you should be able to ignore INLINE_FUN > > double gsl_pow_2(const double x); > > is the correct declaration. > >> #define GSL_VAR extern // used in rng/gsl_rng.h:GSL_VAR const gsl_rng_type *gsl_rng_borosh13; >> >> perhaps GSL_VAR can be ignored and I could use: >> >> gsl_rng_borosh13 const(gsl_rng_type)*; > > It should be > > extern gsl_rng_type* gsl_rng_borosh13; I see. Thanks. > I think you might have some confusion between function declarations: > > T myFunction(Q myArg); > > function pointer type declarations: > > alias MyFunctionPointerType = T function(Q myArg); > > and function pointer declarations: > > MyFunctionPointerType myFunctionPointer; Sorry in my haste to describe what I was doing I wrote down a function pointer instead of a function - my original code was a function. Your suggestion of looking at the https://github.com/abrown25/gsld library is a good call. I'll probably end up sending a pull request to that library after using it as a basic outline of how to deal with these preprocessors. |
Copyright © 1999-2021 by the D Language Foundation