3

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

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

我怎样才能只使用像这样的库中的某些功能?

我试过

#define sqrt cmath::sqrt

但这没有用,我以前见过类似的东西

#define cout std::cout

我想,所以我认为它可能会起作用。

有任何想法吗?

4

6 回答 6

4

将您的代码放在您自己的命名空间中。通过使用命名空间运算符 (::),您可以区分具有相同名称(并且在同一范围内)的变量。

于 2011-10-25T15:03:48.253 回答
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";
}
于 2011-10-25T14:58:50.030 回答
1

是的,你可以只使用你想要的部分。

只需为您需要访问的那些函数/全局变量创建您自己的部分 mini_cmath.h 标头(假设它们不冲突!)。

正如一些人所指出的,没有办法只#include一个给定的块(除非包含的头文件有预处理器宏来启用这样的东西,例如windows.h)

但是,如果您只是简单地(正确地)声明您希望使用的那些函数,然后编译和链接(只要必要的 .lib 包含在您的链接中),那么您就是黄金。


但是,在更一般的说明中 - 全局变量通常是一个坏主意,但如果您出于希望的正当理由绝对必须使用它们,那么您应该将它们放在命名空间中,并通过完全限定名称在源代码中引用它们:

namespace AcmeCorp {
  int g_fubar;
}
AcmeCorp::g_fubar = 9;
于 2011-10-25T15:10:48.163 回答
0

编辑为什么要y1与 math.h 中的任何内容发生冲突?使用您自己的命名空间。您仍然可以使用sqrt,并且可以通过解析来访问命名空间中的内容mynamespace::y1

反正 cmath就是头文件的别名math.hstd是一个命名空间,其中cout包含iostream.h.

因此,虽然您可以使用std::cout,但不能对头文件进行相同的范围解析。你只需要包括math.h, 或cmath.

而且你不需要#define像这样使用 for cout 。只需添加一个using namespace std,您就不必解析范围。

如果您担心的话,使用整个命名空间不会造成任何开销。干杯!

于 2011-10-25T15:00:55.747 回答
0

只是#include <cmath>。如果您的变量名是这样的问题,那么重命名它们。您不能只包含文件的一部分。

于 2011-10-25T15:02:58.237 回答
0

y1()是 C 数学库的许多 POSIX 扩展之一。您可以通过在包括之前取消定义以下宏来删除这些扩展<cmath>

#undef _SVID_SOURCE
#undef _BSD_SOURCE
#undef _XOPEN_SOURCE

一般来说,避免将您自己的任何名称放在全局命名空间中也是一个非常好的主意,因为如果您使用任何 C 库,则很有可能发生冲突。尽可能避免使用全局变量,如果必须使用全局变量,请将其放在自己的命名空间中。

于 2011-10-26T14:42:01.347 回答