C++中库函数的应用
天在看apache和nginx的区别,其中看到了一个是这样的:apache支持静态和动态编译;而nginx只支持静态编译。
那么什么是动态编译,什么又是静态编译呢,特地拿出了《鸟哥的linux私房菜》,特把重点总结如下。
依据一个函数库**是否被编译到程序内部**可以把函数库分为两种:动态函数库和静态函数库:
-
静态函数库
一般扩展名为(.a),这类的函数库通常扩展名为libxxx.a 。
这类函数库在编译的时候会直接整合到程序中,所以利用静态函数库编译成的文件会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,而不再需要向外部要求读取函数哭的内容;但是从升级难易度来看明显没有优势,如果函数库更新,需要重新编译。 -
动态函数库
动态函数库的扩展名一般为(.so),这类函数库通常名为libxxx.so 。
与静态函数库被整个捕捉到程序中不同,动态函数库在编译的时候,在程序里只有一个“指向”的位置而已,也就是说当可执行文件需要使用到函数库的机制时,程序才会去读取函数库来使用;也就是说可执行文件无法单独运行。综上可以知道,静态函数库可能都是源代码,而动态函数库本身就可能是一个可执行文件。
前言
函数又叫做功能,就是将一个功能的一堆实现代码封装到一起,而它的作用就是通过简单的一条语句就可以使用这个功能,而不需要知道代码怎样写。
举个例子,
std::sqrt()
函数的功能是:求一个数的根。std
是前面提到的命名空间,而sqrt
就是这个函数的名字,这个函数在cmath
标准库中。可以用下面的形式使用这个功能:std::sqrt(100);
像上面这样使用函数的功能,就叫做调用函数。上面代码中,100作为函数参数传给函数,让函数来计算它的运算结果。
std::sqrt()
函数是用来求根的,所以会有计算结果,可以用下面代码输出计算结果:std::cout << std::sqrt(100) << std::endl;
函数的计算结果叫做返回值。当然也可以用变量来保存返回值:
double root = std::sqrt(100);
而整个过程,你都不需要考虑
std::sqrt()
函数里面的代码是怎样写的,这就是函数的作用。C++中的标准库(包含C语言的函数库)有很多非常有用的函数。
调用函数
C++标准库中有很多非常有用的函数,当然,如果想提高水平不妨尝试以下实现标准库的功能。但是实际工程中,建议能使用标准库就不要自己再写一个。因为,你手写一个需要时间,调用不需要;而且你不留意还会写出bug;还有,标准库里的东西编译器都会有优化,你写的不一定会比标准库里的快。
如果你调用的函数不是自己写的,那你就需要知道函数怎么调用,函数需要的参数应该怎么填。
例如标准库
cmath
中的函数std::abs()
,它是用来求绝对值的,它只有一个参数而且这个参数只能接收数值,它会将这个参数转换成绝对值,然后通过返回值返回。#include <cmath> // std::abs #include <iostream> // std::cout std::endl int main(void) { std::cout << std::abs(-100) << std::endl; return 0; }
输出结果:
100
对于标准库里的函数,可以参考我在第一篇教程中提到的两个说明文档,也可以在网上找资料。
注意:C++可以调用C语言的标准库,但是C语言的标准库在C++中是弃用的,即不推荐使用。如:C++标准库
cmath
对应C语言的标准库是math.h
。就是说,建议调用cmath
而不是math.h
巩固练习
- 从终端输入一个数,代表弧度,然后输出这个弧度的
cos
、sin
、tan
的值。可以使用std::cos()
、std::sin()
、std::tan()
,这三个函数都在cmath
标准库中。 - 从终端输入一个数,代表角度,然后使用
std::cos()
、std::sin()
、std::tan()
计算出这个角度对应的值。 - 输入一个数,使用
std::pow()
函数求这个数的平方和立方。std::pow()
函数在cmath
标准库中。
- 从终端输入一个数,代表弧度,然后输出这个弧度的