Search code examples
c++visual-studiowarningsogre3d

How best to deal with warning c4305 when type could change?


I'm using both Ogre and NxOgre, which both have a Real typedef that is either float or double depending on a compiler flag. This has resulted in most of our compiler warnings now being:

warning C4305: 'argument' : truncation from 'double' to 'Ogre::Real'

When initialising variables with 0.1 for example. Normally I would use 0.1f but then if you change the compiler flag to double precision then you would get the reverse warning. I guess it's probably best to pick one and stick with it but I'd like to write these in a way that would work for either configuration if possible.

One fix would be to use #pragma warning (disable : 4305) in files where it occurs, I don't know if there are any other more complex problems that can be hidden by not having this warning. I understand I would push and pop these in header files too so that they don't end up spreading across code.

Another is to create some macro based on the accuracy compiler flag like:

#if OGRE_DOUBLE_PRECISION
    #define INIT_REAL(x) (x)
#else
    #define INIT_REAL(x) static_cast<float>( x )
#endif

which would require changing all the variable initialisation done so far but at least it would be future proof.

Any preferences or something I haven't thought of?


Solution

  • The simple solution would be to just add a cast:

    static_cast<Ogre::Real>(0.1);
    

    or you could write a function to do the conversion for you (similar to your macro, but avoiding all the yucky problems macros bring:

    template <typename T>
    inline Ogre::Real real(T val) { return static_cast<Ogre::Real>(val); } 
    

    Then you can just call real(0.1) and get the value as an Ogre::Real.