Thread overview
noob in c macro preprocessor hell converting gsl library header files
Jan 06, 2016
data pulverizer
Jan 06, 2016
John Colvin
Jan 06, 2016
data pulverizer
January 06, 2016
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
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
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.