Переключение между плавающей и двойной точностью во время компиляции

На что мне смотреть, если я хочу переключаться между плавающей и двойной точностью во время компиляции. Это похоже на то, что если пользователь хочет, чтобы все было с плавающей запятой, а не с двойной точностью, как я могу сохранить эту гибкость? Другими словами, как мне определить переменную, которая может быть условной либо с плавающей запятой, либо с двойной точностью?


person Shibli    schedule 24.01.2013    source источник
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
comment
Скомпилируйте обе копии, поставьте перед собой перенаправитель сценария оболочки и вуаля! - person user7116; 25.01.2013
comment
@Shibli Есть несколько способов. Использование опции компилятора -D... работает для многих компиляторов UNIX. В Windows вы можете установить использование /D или добавить USE_DOUBLES в список определений препроцессора в свойствах вашего проекта C/C++. - person Sergey Kalinichenko; 25.01.2013
comment
Я поместил -DUSE_DOUBLES=1 непосредственно в свой make-файл и проверил тип переменной, которая была с плавающей запятой. Итак, как можно использовать это для make-файла? - person Shibli; 25.01.2013
comment
@Shibli Как вы проверили тип переменной? Вы объявили все свои переменные, которые должны изменяться между float и double, как user_data_t, верно? - person Sergey Kalinichenko; 25.01.2013
comment
Я объявил новую переменную как user_data_t temp, затем проверил тип как cout << typeid(temp).name();, после чего он дал f. - person Shibli; 25.01.2013
comment
@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