仅使用库中的某些功能?

时间:2011-10-25 14:53:04

标签: c++ libraries sqrt cmath

我想只使用math.h中的某些函数(不包括整个库)

例如,我需要使用“sqrt”和“exp”,但是我有变量名为“y1”(可能还有其他)与math.h中的定义冲突

我怎样才能使用像这样的库中的某些函数?

我试过

#define sqrt cmath::sqrt

但这不起作用,我之前看过类似的东西

#define cout std::cout

我想,所以我认为它可能有用。

任何想法?

6 个答案:

答案 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.hcmath

你不需要像那样使用#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库,很可能会发生冲突。尽可能避免使用全局变量,如果必须使用全局变量,请将其放在自己的命名空间中。