Я использую как Ogre, так и NxOgre, которые имеют Real
typedef, который либо float
, либо double
в зависимости от флага компилятора. Это привело к тому, что большинство наших предупреждений компилятора теперь составляют:Как лучше справляться с предупреждением c4305, когда тип может измениться?
warning C4305: 'argument' : truncation from 'double' to 'Ogre::Real'
При инициализации переменных, например, 0,1. Обычно я использовал бы 0.1f, но если вы измените флаг компилятора на двойную точность, вы получите обратное предупреждение. Я думаю, что лучше всего выбрать один и придерживаться его, но я бы хотел написать их таким образом, чтобы они работали для любой конфигурации, если это было возможно.
Одним из исправлений было бы использование #pragma warning (disable : 4305)
в файлах, где это происходит, я не знаю, есть ли какие-либо другие более сложные проблемы, которые могут быть скрыты, не имея этого предупреждения. Я понимаю, что я бы нажал и поместил их в заголовочные файлы, чтобы они не распространялись по всему коду.
Другой способ заключается в создании какой-то макрос, на основе флага компилятора точности, как:
#if OGRE_DOUBLE_PRECISION
#define INIT_REAL(x) (x)
#else
#define INIT_REAL(x) static_cast<float>(x)
#endif
, который потребует изменения всех переменная инициализации сделано до сих пор, но, по крайней мере, было бы на будущее.
Любые предпочтения или что-то, о чем я не думал?
'static_cast (0.1)'? –
jalf
@jalf - немного глоток, если у вас их все по месту, когда вы инициализируете значения по умолчанию - вот почему я подумал об использовании короткого макроса. Могу ли я напечатать это или что-то, чтобы сделать его более читаемым/менее типичным? – identitycrisisuk
вы можете определить функцию вместо макроса. Как насчет 'template inline Ogre :: Real real (T val) {return static_cast (val); } ' –
jalf