Отметьте свои функции как встроенные
inline double ptr2double(void* pv){
ptr_u ptr;
ptr.p = pv;
return (ptr.d);
};
inline void* double2ptr(double dv){
ptr_u ptr;
ptr.d = dv;
return(ptr.p);
};
Видите ли, когда вы включили одну и ту же функцию в два отдельных исходных файла (единицы перевода), вы получите несколько определений. Обычно у вас есть 2 варианта:
- Содержит описания ваших функций в файле .h и определения в отдельном файле .cpp
- Сделайте ваши функции встроенными и сохраните их в файле .h
Правило с одним определением C ++ запрещает множественные определения не встроенных функций.
EDIT:
#ifdef
защищает от множественного включения в одиночный исходный файл. Но вы действительно можете включить файл .h в разные файлы .cpp. ODR применяется к определениям всей программы, а не только одного файла.
EDIT2
После некоторых комментариев я чувствую, что должен включить сюда эту информацию, чтобы не было недопонимания. В C ++ существуют разные правила, касающиеся встроенных и не встроенных функций, например, особый случай ODR. Теперь вы можете пометить любую функцию (будь она длинной или рекурсивной, не имеет значения) как встроенную, и к ним будут применяться специальные правила. Это совершенно другой вопрос, решит ли компилятор на самом деле встроить его (то есть заменить код вместо вызова), что он может сделать, даже если вы не помечаете функцию как встроенную и можете решить не делать этого даже если вы отметите его как встроенный.