Итак, я работаю над проектом, в котором я собираюсь реализовать свои собственные версии тригонометрических функций, квадратный корень, округление & экспоненты без помощи библиотек math.h или cmath, которые должны выполняться с помощью Visual Studio 2015 или 2017. Я привык работать с GCC, где, когда они явно не включают math.h или cmath, их соответствующие функции не связаны. В моих пустых, недавно установленных проектах Visual Studio после включения только iostream я, кажется, приобрел возможность использовать функции sin, cos и tangent, а также ошибку при повторном объявлении функций. С тех пор я недавно создал фиктивный проект на обоих компьютерах (один — рабочий компьютер с новой установкой VS2017, другой — персональный компьютер с VS2015) и удалил все связанные библиотеки, но все еще не могу найти способ удалить библиотеки по математике от включения, когда у меня есть только
#include <iostream>
int main()
{
float n = sin(3.1415f);
return 0;
};
во всем моем проекте. Я не уверен, как, не будучи связанным с внешними файлами, с перестройкой проекта и без каких-либо других включений, я могу получить доступ
функция sin (). Далее, если я изменю свой файл на
#include <iostream>
float sin(float n)
{
return 1.0f;
};
int main()
{
float n = sin(3.1415f);
return 0;
};
Это дарит мне C2382. Это происходит независимо от того, есть ли в моих внешних зависимостях другие файлы или нет. Как мне удалить удаление включения в math.h, сохранив доступ к базовым функциям, таким как printf (), std :: cout и system («PAUSE»); для целей этого проекта, как я бы в среде GCC?
Любой стандартный заголовок библиотеки может включать любой другой; в VC ++ путь включения заканчивается на <cmath>
является iostream->istream->ostream->ios->xlocnum
,
Однако в целом включение math.h / cmath само по себе не должно быть проблемой, поскольку определяемые вами замены имеют идентичные подписи и что вы косвенно или иным образом не используете какие-либо интерфейсы, которые вы не определили. То есть вам не нужно удалять math.h, это полезно для обеспечения сопоставимости стандарта и вашей реализации. Скорее всего, вам нужно запретить компоновщику связывать математическую библиотеку (в то же время предположительно связывать другие части библиотеки C).
К сожалению, это невозможно в VC ++, потому что в отличие от GCC, где mlib и cstdlib являются отдельными библиотеками, в VC ++ вся стандартная библиотека представляет собой единый объект. Более того, стандартная библиотека C ++ имеет зависимости от этой библиотеки, поэтому вам придется заменить не только математические функции, чтобы вообще не связывать стандартную библиотеку.
Можно указать VC ++ игнорировать библиотеки по умолчанию следующим образом:
но монолитная природа стандартной библиотеки означает, что она не сильно вам поможет, поскольку существует множество других зависимостей даже от самой простой пустой main()
код, потому что вся среда выполнения C (то, что находится в crt0.o в GCC) включена в одну и ту же библиотеку.
Ваш лучший подход заключается в том, чтобы продолжить работу с вашими функциями в их собственном пространстве имен — то есть после того, для чего предназначены пространства имен. В заголовочный файл вашей библиотеки вы можете включить определения макросов, чтобы избежать связывания стандартных математических функций:
#define sin mymath::sin
Но это не совсем удовлетворительно — если ваш заголовок включен до любой стандартный заголовок, который включает math.h (напрямую или косвенно), он может не ссылаться или даже компилироваться способами, которые трудно понять.
Если вы собираетесь реализовать свои собственные версии математических функций, то было бы предпочтительнее заключить их в свое собственное пространство имен, чтобы избежать конфликтов имен.
#include <iostream>
namespace n_my_math
{
float sin(float n)
{
return 1.0f;
}
} // namespace n_my_math
int main()
{
float n = n_my_math::sin(3.1415f);
return 0;
};