我想只使用math.h中的某些函数(不包括整个库)
例如,我需要使用“sqrt”和“exp”,但是我有变量名为“y1”(可能还有其他)与math.h中的定义冲突
我怎样才能使用像这样的库中的某些函数?
我试过
#define sqrt cmath::sqrt
但这不起作用,我之前看过类似的东西
#define cout std::cout
我想,所以我认为它可能有用。
任何想法?
答案 0 :(得分:4)
将您的代码放在您自己的命名空间中。通过使用名称空间运算符(::),您可以区分具有相同名称的变量(并且它们位于相同的范围内)。
答案 1 :(得分:3)
只是使用它们?
#include <cmath>
int main()
{
double d = 4.0;
sqrt(d);
exp(d);
}
您还可以明确指定命名空间:
#include <cmath>
int main()
{
double d = 4.0;
std::sqrt(d);
std::exp(d);
}
如果需要,您可以从命名空间引入特定名称,而无需引入整个命名空间。这是使用using
关键字完成的。请不要为此创建#define
:
#include <string>
using std::string;
int main()
{
string s = "foo";
}
答案 2 :(得分:1)
是的,您可以使用您想要的部件。
只需为您需要访问的函数/全局变量创建自己的部分mini_cmath.h标头(假设那些不冲突!)。
有几个人已经注意到,没有办法只#include一个给定的块(除非包含的头有预处理器宏来启用这样的东西,比如windows.h)
但是,如果你只是声明你想要使用的那些功能(正确),然后编译&amp;链接(只要链接中包含必要的.lib),那么你就是金色的。
然而,从更一般的角度来看 - 一般来说全局变量是一个坏主意,但如果你绝对必须使用它们是出于有希望的有效理由,那么你应该将它们放在命名空间中,并引用它们它们在您的来源中由完全限定的名称:
namespace AcmeCorp {
int g_fubar;
}
AcmeCorp::g_fubar = 9;
答案 3 :(得分:0)
编辑:为什么使用您自己的命名空间。您仍然可以使用y1
与math.h中的任何内容冲突?sqrt
,并且可以通过mynamespace::y1
解析来访问命名空间中的内容。
反正
cmath
是标头文件math.h
的别名。
std
是一个命名空间,其中包含cout
中的iostream.h
对象。
因此,虽然您可以使用std::cout
,但您无法使用头文件执行相同的范围解析。您只需加入math.h
或cmath
。
你不需要像那样使用#define
来表达cout。只需添加using namespace std
,您就不必解析范围。
使用整个命名空间不会导致任何开销,如果这是您所关注的。干杯!
答案 4 :(得分:0)
只需#include <cmath>
。如果您的变量名称是这样的问题,那么重命名它们。你不能只包含一个文件。
答案 5 :(得分:0)
y1()
是C数学库的许多POSIX扩展之一。您可以在包含<cmath>
:
#undef _SVID_SOURCE
#undef _BSD_SOURCE
#undef _XOPEN_SOURCE
一般来说,避免在全局命名空间中放置任何自己的名称也是一个非常好的主意,因为如果使用任何C库,很可能会发生冲突。尽可能避免使用全局变量,如果必须使用全局变量,请将其放在自己的命名空间中。