На что мне смотреть, если я хочу переключаться между плавающей и двойной точностью во время компиляции. Это похоже на то, что если пользователь хочет, чтобы все было с плавающей запятой, а не с двойной точностью, как я могу сохранить эту гибкость? Другими словами, как мне определить переменную, которая может быть условной либо с плавающей запятой, либо с двойной точностью?
Переключение между плавающей и двойной точностью во время компиляции
comment
Во время компиляции или во время выполнения?
- person user7116   schedule 25.01.2013
Ответы (3)
Если можно сделать переключение во время компиляции, подойдет простой typedef
:
#ifdef USE_DOUBLES
typedef double user_data_t;
#else
typedef float user_data_t;
#endif
Используйте user_data_t
в своем коде и установите USE_DOUBLES
, если вы хотите doubles
во время компиляции:
g++ -DUSE_DOUBLES=1 myprogram.cpp
person
Sergey Kalinichenko
schedule
24.01.2013
Скомпилируйте обе копии, поставьте перед собой перенаправитель сценария оболочки и вуаля!
- person user7116; 25.01.2013
@Shibli Есть несколько способов. Использование опции компилятора
-D...
работает для многих компиляторов UNIX. В Windows вы можете установить использование /D
или добавить USE_DOUBLES
в список определений препроцессора в свойствах вашего проекта C/C++.
- person Sergey Kalinichenko; 25.01.2013
Я поместил
-DUSE_DOUBLES=1
непосредственно в свой make-файл и проверил тип переменной, которая была с плавающей запятой. Итак, как можно использовать это для make-файла?
- person Shibli; 25.01.2013
@Shibli Как вы проверили тип переменной? Вы объявили все свои переменные, которые должны изменяться между
float
и double
, как user_data_t
, верно?
- person Sergey Kalinichenko; 25.01.2013
Я объявил новую переменную как
user_data_t temp
, затем проверил тип как cout << typeid(temp).name();
, после чего он дал f
.
- person Shibli; 25.01.2013
@Shibli Я только что попробовал то же, что и вы: я скомпилировал небольшую программу (ссылка на pastebin) с помощью команды
g++ -DUSE_DOUBLES=1 x.cpp
и получил d
; когда я скомпилировал с g++ x.cpp
, я получил f
.
- person Sergey Kalinichenko; 25.01.2013
Не зная точно, как вы собираетесь использовать данные, трудно порекомендовать правильное решение.
Взгляните на тип даты union.
http://msdn.microsoft.com/en-us/library/5dxy4b7b(v=VS.80).aspx
Шаблоны также могут быть приемлемым вариантом в зависимости от использования.
http://msdn.microsoft.com/en-us/library/y097fkab.aspx
person
Inisheer
schedule
24.01.2013
Я предпочитаю не использовать #define
в своем коде.
У меня было бы два разных заголовка с двумя разными typedef
, и я бы разрешил параметрам сборки выбирать, какой заголовок включен.
person
Peter Wood
schedule
24.01.2013