从项目中删除 math.h VS 2015 / 2017
Removing math.h from a project VS 2015 / 2017
所以,我正在做一个项目,我打算在没有 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;
};
在我的整个项目中。我不确定如何在不链接到外部文件、重建项目并且没有任何其他包含的情况下访问
罪()函数。此外,如果我将文件更改为
#include <iostream>
float sin(float n)
{
return 1.0f;
};
int main()
{
float n = sin(3.1415f);
return 0;
};
它给了我 C2382。无论我的外部依赖项中是否包含其他文件,都会发生这种情况。我将如何在保持对 printf()、std::cout 和 system("PAUSE") 等基本功能的访问的同时删除对 math.h 的包含?为了这个项目的目的,就像我在 GCC 环境中一样?
- 遗憾的是,尽管我一直在命名空间内进行开发以根据标准库检查我的实现,但我并不打算将标准数学函数链接到最终结果。这在 GCC 中很容易完成,但是正如我提到的,这个项目必须在 VS 中。
如果您要实现您自己的数学函数版本,那么最好将它们包装到您自己的命名空间中以避免名称冲突。
#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;
};
任何标准库 header 可能包含任何其他的;在 VC++ 中,以 <cmath>
结尾的包含路径是 iostream->istream->ostream->ios->xlocnum
.
但是一般来说,包括 math.h/cmath 本身应该不是问题,只要您定义的替换具有相同的签名并且您不间接或以其他方式使用您未定义的任何接口。也就是说,您需要删除的不是 math.h - 这有助于确保标准与您的实现之间的可比性。相反,您需要做的是防止 linker linking 数学库(同时可能 linking C 库的其他部分。
不幸的是,这在 VC++ 中是不可能的,因为与 GCC 不同,其中 mlib 和 cstdlib 是独立的库,在 VC++ 中,整个标准库是一个单一的实体。此外,C++ 标准库依赖于该库,因此您不仅要替换数学函数,还要完全避免 linking 标准库。
可以指示 VC++ 忽略默认库,如下所示:
但是标准库的整体性质意味着它不会对您有太大帮助,因为即使是最简单的空 main()
代码也有许多其他依赖项,因为所有 C run-time 环境( GCC crt0.o 中的那种东西)包含在同一个库中。
您最好的方法是在它们自己的命名空间中继续使用您的函数 - 这毕竟是命名空间的用途。在您的库 header 文件中,您可以包含宏定义以避免 linking 标准数学函数:
#define sin mymath::sin
但这并不完全令人满意 - 如果您的 header 包含在 之前 任何包含 math.h 的标准 header(直接到间接),它可能无法 link 甚至无法以难以理解的方式编译。
所以,我正在做一个项目,我打算在没有 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;
};
在我的整个项目中。我不确定如何在不链接到外部文件、重建项目并且没有任何其他包含的情况下访问 罪()函数。此外,如果我将文件更改为
#include <iostream>
float sin(float n)
{
return 1.0f;
};
int main()
{
float n = sin(3.1415f);
return 0;
};
它给了我 C2382。无论我的外部依赖项中是否包含其他文件,都会发生这种情况。我将如何在保持对 printf()、std::cout 和 system("PAUSE") 等基本功能的访问的同时删除对 math.h 的包含?为了这个项目的目的,就像我在 GCC 环境中一样?
- 遗憾的是,尽管我一直在命名空间内进行开发以根据标准库检查我的实现,但我并不打算将标准数学函数链接到最终结果。这在 GCC 中很容易完成,但是正如我提到的,这个项目必须在 VS 中。
如果您要实现您自己的数学函数版本,那么最好将它们包装到您自己的命名空间中以避免名称冲突。
#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;
};
任何标准库 header 可能包含任何其他的;在 VC++ 中,以 <cmath>
结尾的包含路径是 iostream->istream->ostream->ios->xlocnum
.
但是一般来说,包括 math.h/cmath 本身应该不是问题,只要您定义的替换具有相同的签名并且您不间接或以其他方式使用您未定义的任何接口。也就是说,您需要删除的不是 math.h - 这有助于确保标准与您的实现之间的可比性。相反,您需要做的是防止 linker linking 数学库(同时可能 linking C 库的其他部分。
不幸的是,这在 VC++ 中是不可能的,因为与 GCC 不同,其中 mlib 和 cstdlib 是独立的库,在 VC++ 中,整个标准库是一个单一的实体。此外,C++ 标准库依赖于该库,因此您不仅要替换数学函数,还要完全避免 linking 标准库。
可以指示 VC++ 忽略默认库,如下所示:
但是标准库的整体性质意味着它不会对您有太大帮助,因为即使是最简单的空 main()
代码也有许多其他依赖项,因为所有 C run-time 环境( GCC crt0.o 中的那种东西)包含在同一个库中。
您最好的方法是在它们自己的命名空间中继续使用您的函数 - 这毕竟是命名空间的用途。在您的库 header 文件中,您可以包含宏定义以避免 linking 标准数学函数:
#define sin mymath::sin
但这并不完全令人满意 - 如果您的 header 包含在 之前 任何包含 math.h 的标准 header(直接到间接),它可能无法 link 甚至无法以难以理解的方式编译。