C++ 从项目中删除math.VS 2015/2017

C++ 从项目中删除math.VS 2015/2017,c++,visual-studio,c-libraries,C++,Visual Studio,C Libraries,因此,我正在从事一个项目,我打算在没有math.h或cmath库帮助的情况下实现我自己版本的三角函数、平方根、舍入和指数,这必须使用Visual Studio 2015或2017来完成。我习惯于使用GCC,在GCC中,当没有明确包含math.h或cmath时,它们各自的函数没有链接。在我的空的、新安装的VisualStudio项目中(仅包括iostream),我似乎获得了使用sin、cos和tangent函数的能力,以及重复声明函数的错误。此后,我在两台计算机(一台是运行VS2017新安装的工作

因此,我正在从事一个项目,我打算在没有math.h或cmath库帮助的情况下实现我自己版本的三角函数、平方根、舍入和指数,这必须使用Visual Studio 2015或2017来完成。我习惯于使用GCC,在GCC中,当没有明确包含math.h或cmath时,它们各自的函数没有链接。在我的空的、新安装的VisualStudio项目中(仅包括iostream),我似乎获得了使用sin、cos和tangent函数的能力,以及重复声明函数的错误。此后,我在两台计算机(一台是运行VS2017新安装的工作计算机,另一台是运行VS2015的个人计算机)上新创建了一个虚拟项目,并删除了所有链接库,但仍然无法找到方法在我只有一台计算机的情况下删除包含的数学库

#include <iostream>

int main()
{
    float n = sin(3.1415f);
    return 0;
};
#包括
int main()
{
浮点数n=sin(3.1415f);
返回0;
};
在我的整个项目中。我不确定在没有链接到外部文件、重建项目以及没有任何其他包含的情况下,我如何能够访问 sin()函数。如果我将文件更改为

#include <iostream>

float sin(float n)
{
    return 1.0f;
};

int main()
{
    float n = sin(3.1415f);
    return 0;
};
#包括
浮点数sin(浮点数n)
{
返回1.0f;
};
int main()
{
浮点数n=sin(3.1415f);
返回0;
};
它给了我一个新的机会。无论我的外部依赖项中是否包含其他文件,都会发生这种情况。在保持对printf()、std::cout和system(“PAUSE”)等基本功能的访问的同时,如何删除math.h的包含内容;为了这个项目的目的,就像我在GCC环境中一样

  • 遗憾的是,尽管我一直在开发一个名称空间来对照标准库检查我的实现,但我并不打算让标准数学函数甚至链接到最终结果。这在GCC中很容易实现,但正如我提到的,这个项目必须在VS中完成

如果要实现自己版本的数学函数,最好将它们包装到自己的命名空间中,以避免名称冲突

#包括
名称空间n_我的数学
{
浮点数sin(浮点数n)
{
返回1.0f;
}
}//名称空间n_我的数学
int main()
{
float n=n_my_math::sin(3.1415f);
返回0;
};

任何标准库标题可能包括任何其他标题;在VC++中,以
结尾的include路径是
iostream->istream->ostream->ios->xlocnum

但是,一般来说,只要您定义的替换具有相同的签名,并且您不间接或以其他方式使用任何未定义的接口,那么包括math.h/cmath本身就不应该是问题。也就是说,您需要删除的不是math.h,这有助于确保标准和实现之间的可比性。相反,您需要做的是防止链接器链接数学库(同时仍然可能链接C库的其他部分)

遗憾的是,在VC++中,这是不可能的,因为不像GCC,MLIB和CSTDLIB是独立的库,在VC++中,整个标准库是单个实体。而且C++标准库对该库有依赖性,因此,为了避免链接标准库A,您将不得不替换更多的数学函数。不全是

可以指示VC++忽略默认库,如下所示:

但是,标准库的整体性意味着它不会对您有多大帮助,因为即使是最简单的空
main()
code,也存在许多其他依赖项,因为所有C运行时环境(GCC中的crt0.o中的那种东西)都包含在同一个库中

最好的方法是在自己的名称空间中继续使用函数,这是在名称空间的用途之后。在库头文件中,可以包含宏定义,以避免链接标准数学函数:

#define sin mymath::sin

但这并不完全令人满意——如果您的标题包含在包含math.h的任何标准标题之前(直接或间接),它可能无法链接,甚至无法以难以理解的方式编译。

你可以使用宏,例如,毕竟包括add
#define sin mysin
。如果你在名称空间中声明函数,并使用它们会怎么样?遗憾的是,我甚至不允许链接其他函数,否则我已经在开发t在名称空间中添加宏,以对照标准库检查函数的输出,以进行测试。宏可能是一个合理的想法,但我宁愿删除数学库的包含,这样我就不会包含无关代码,也不会对大约12个需要重载的函数使用过多的宏。我记得读过一些Visual Studio(或其编译器)包含硬编码逻辑来内联基本的数学函数。这就是为什么如果重新定义
sin()
,它会抱怨的原因。唯一真正可行的方法是将自己的数学函数放在一个单独的命名空间中,并按全名调用它们(例如
y=yourmath::sin(x)
).但这不会阻止程序员调用标准版本-唯一的解决方法是非技术性的(例如策略设置)也需要代码,也可以用任何编译器来编译,而不是<代码> >包含<代码> >代码> >代码>。不要垃圾邮件标签!C不是C++,不是C!而且标准库的名字是在托管环境中保留的。你不能使用它们。用你的其他名字代替。看起来OP已经知道这个解决方案。他实际上正在寻找一种方法。排除
cmath
功能(如果可能的话)