C++ 仅使用库中的某些函数?

C++ 仅使用库中的某些函数?,c++,libraries,sqrt,cmath,C++,Libraries,Sqrt,Cmath,我只想使用math.h中的某些函数(不包括整个库) 例如,我需要使用“sqrt”和“exp”,但我有名为“y1”的变量(可能还有其他变量),它们与math.h中的定义冲突 我怎样才能只使用像那样的库中的某些函数 我试过了 #define sqrt cmath::sqrt 但这不起作用,我以前也见过类似的情况 #define cout std::cout 我想,所以我认为它可能会起作用 有什么想法吗?就用吧 #include <cmath> int main() { do

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

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

我怎样才能只使用像那样的库中的某些函数

我试过了

#define sqrt cmath::sqrt
但这不起作用,我以前也见过类似的情况

#define cout std::cout
我想,所以我认为它可能会起作用

有什么想法吗?

就用吧

#include <cmath>

int main()
{
    double d = 4.0;
    sqrt(d);
    exp(d);
}
编辑:为什么
y1
与数学.h中的任何内容冲突?使用您自己的名称空间。您仍然可以使用
sqrt
,并且可以通过
mynamespace::y1
解析来访问命名空间中的内容

反正,
cmath
是头文件
math.h
的别名。
std
是一个名称空间,它包含
iostream.h
中的
cout
对象

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

你不需要用
#define
来定义这样的cout。只需使用namespace std添加一个
,就不必解析范围


如果您关心的是整个名称空间,那么使用整个名称空间不会导致任何开销。干杯

只是
#包括
。如果您的变量名存在这样的问题,请重命名它们。不能只包含文件的一部分。

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

是的,您可以只使用所需的部分

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

正如一些人指出的那样,没有办法只包含给定的块(除非包含的头具有预处理器宏来启用这样的功能,例如windows.h)

但是,如果您只是声明希望使用的函数(正确),然后编译&link(只要链接中包含必要的.lib),那么您就成功了


但是,更一般地说,globals通常是一个坏主意,但是如果出于合理的理由必须使用它们,那么应该将它们放在名称空间中,并在源代码中以完全限定的名称引用它们:

namespace AcmeCorp {
  int g_fubar;
}
AcmeCorp::g_fubar = 9;
y1()
是C数学库的众多POSIX扩展之一。在包含
之前,可以通过取消定义以下宏来删除这些扩展:


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

这不起作用-我不能包含全局变量,因为它与我使用的不同变量冲突。关键是我想在中使用函数,而不包括整个库。@Laurbert515-
#include
使预处理器转储包含文件的内容,没有选择性包含。是的,它们是。我是多线程的。你指的是什么数学?C-Runtime math.h?还是C++标准库(没有A?)或者完全是别的什么?我认为使用math.hA变量,如
y1
不应与任何标准头中声明的任何内容冲突。您得到的错误到底是什么?driver.cpp:18:error:“float y1”重新声明为不同类型的符号/usr/include/architecture/i386/math.h:524:error:先前的“double y1(double)”声明取决于平台,您将在
math.h
header:
extern double y1(double)-y1在cmath中定义。。。driver.cpp:18:error:“float y1”被重新声明为不同类型的符号/usr/include/architecture/i386/math.h:524:error:先前声明的“double y1(double)”@birryrree Ah!我想,那不是标准C++的一部分。Pit看起来很疯狂,像“y1”这样的基本函数与预定义函数冲突。真的没有办法只包含头文件中的sqrt吗?我不明白为什么它看起来这么奇怪?这只是一个已经使用过的Declaration,就像您声明了一个名为q1的变量并试图在其他地方定义它一样。问题是y1在其他地方被定义为一个函数,我想将其用作浮点。因此,如果可能的话,请更改变量名或将其封装在类或命名空间中。cmath对它的定义并不重要-您不能将其用于自己的名称。这是否意味着我必须创建自己的sqrt函数?不。您只需对变量使用
myNamespace::y1
。但是再想想。如果我的名字与标准库有冲突,我总是会为我的变量选择不同的名字。所以我会简单地将math.h中定义的函数复制/粘贴到我自己的头中,并将其链接到我自己的头中?当然,只要我们谈论的是C运行时风格的函数。如果我们说的是STL模板,那就更难(如果不是不可能的话)实现了,因为它们往往很复杂,在标题中定义,并且相互交织。然而,即使在这种情况下,也有可能复制出所需的部分(如果链接是完全模板化的,则不需要任何链接)。
#include <string>

using std::string;

int main()
{
    string s = "foo";
}
namespace AcmeCorp {
  int g_fubar;
}
AcmeCorp::g_fubar = 9;
#undef _SVID_SOURCE
#undef _BSD_SOURCE
#undef _XOPEN_SOURCE