Victor Ruiz
Victor Ruiz

Reputation: 61

trouble with .inl files c++

i have a trouble with a function template implementation in a .inl file (visual c++)

I have this on a header file.

math.h ->>

#ifndef _MATH_H
#define _MATH_H
#include <math.h>

template<class REAL=float>
struct Math
{
     // inside this structure , there are a lot of functions , for example this..
     static REAL  sin ( REAL __x );
     static REAL  abs ( REAL __x );
};

#include "implementation.inl"     // include inl file
#endif

and this is the .inl file.

implementation.inl -->>

template<class REAL>
REAL Math<REAL>::sin (REAL __x)
{
    return (REAL) sin ( (double) __x );
}

template<class REAL>
REAL Math<REAL>::abs(REAL __x)
{
    if( __x < (REAL) 0 )
        return - __x;
    return __x;
}

the sine function throw me an error at run time when i call it. However , abs function works correctly.

i think the trouble is the call to one of the functions of the header math.h inside the .inl files

why I can´t use math.h functions inside .inl file ?

Upvotes: 0

Views: 1222

Answers (1)

Michael Burr
Michael Burr

Reputation: 340218

The problem has nothing to do with .inl files - you're simply calling Math<REAL>::sin() recursively until the stack overflows. In MSVC 10 I even get a nice warning pointing that out:

warning C4717: 'Math<double>::sin' : recursive on all control paths, function will cause runtime stack overflow

Try:

 return (REAL) ::sin ( (double) __x ); // note the `::` operator

Also, as a side note: the macro name _MATH_H is reserved for use by the compiler implementation. In many cases of using an implementation-reserved identifier you'd be somewhat unlucky to actually run into a conflict (though you should still avoid such names). However, in this case that name has a rather high chance of conflicting with the one that math.h might actually be using to prevent itself from being included multiple times.

You should definitely choose a different name that's unlikely to conflict. See What are the rules about using an underscore in a C++ identifier? for the rules.

Upvotes: 2

Related Questions