函数、头文件和库
定义函数:返回类型,函数名称、参数、函数主体。实例:
函数声明,函数声明会告诉编译器函数名称及如何调用函数,函数的实际主题可以单独定义。
函数参数:在程序中使用头文件,需要使用C/C++预处理指令#include来引用它。在比较长的程序中,建议把所有的常量、宏、系统全局变量和函数原型写在头文件中,在需要的时候引用这些头文件。
调用类型 |
描述 |
该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。 |
|
通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。 |
引用头文件的语法,使用预处理#include可以引用用户和系统头文件:
#include <file>:引用的是编译器的类库路径里面的头文件。
#include “file”:引用的是你程序目录的相对路径中的头文件,如果在程序目录没有找到引用的头文件则到编译器的类库路径的目录下找该头文件。
引用头文件的操作:只引用一次头文件:
#ifndef HEADER_FILE
#define HEADER_FILE
the entire header file file
#endif
这种结构就是通常所说的包装#ifndef.当再次引用头文件时,条件为假,因为HEADER_FILE已定义。此时,预处理器会跳过文件的整个内容,编译器会忽略它。有条件引用,有时需要从多个不同的头文件中选择一个引用到程序中。例如,需要指定在不同的操作系统上使用的配置参数。您可以通过一系列条件来实现这点,如下:
#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
#endif
但是如果头文件比较多的时候,这么做是很不妥当的,预处理器使用宏来定义头文件的名称。这就是所谓的有条件引用。它不是用头文件的名称作为 #include 的直接参数,您只需要使用宏名称代替即可:
#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H
SYSTEM_H 会扩展,预处理器会查找 system_1.h,就像 #include 最初编写的那样。SYSTEM_H 可通过 -D 选项被您的 Makefile 定义。
在有多个 .h 文件和多个 .c 文件的时候,往往我们会用一个 global.h 的头文件来包括所有的 .h 文件,然后在除 global.h 文件外的头文件中 包含 global.h 就可以实现所有头文件的包含,同时不会乱。方便在各个文件里面调用其他文件的函数或者变量。
C++标准库可分为两部分:
标准函数库:这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。
面向对象类库:这个库是类及其相关函数的集合。标准的 C++ I/O 类、String 类、数值类、STL 容器类、STL 算法、STL 函数对象、STL 迭代器、STL 分配器、本地化库、异常处理类、杂项支持库。
当然除了标准库外,还有开源的库(例如GitHub上的库文件)和程序员自己编写的库。下面笔者将展示,C++库的创建。静态库与动态库是有很大差别的,此处不予详细介绍。(笔者在尝试把zifu项目制作成静态库的时候,遭遇了许多难以解决的问题。后来发现,可能这类型程序只能使用动态库。)这里笔者使用简单的程序制作一个toos.lib,图片步骤如下:
新建一个Win32项目,并命名为tools,可以不勾选【为解决方案创建目录】(以减小目录)。然后点击【确定】,再点击【下一步】。
接下来,在【源文件】里新建一个tools.cpp文件。编写源代码。
#include <iostream> int add(int a, int b) { return a + b; } int sub(int a, int b) { return a + b; }
【Debug】的下拉窗口选择【Release】,并选择【X64】。(这里使用Release X64的库文件为例展示,其他版本依次类推)点击【生成解决方案后】,如果成功生成,则找到生成的tools.lib文件。右键单击【tools.cpp】在弹出的对话框中选择【打开所在文件夹】(或者按快捷键Ctrl+o)。在弹出的窗口中,点击【x64】,点击【Release】。
并把tools.lib文件复制。然后新建一个【空项目】。项目名称(这里为)ttest(可自己取),并在【源文件】中新建一个ttest.cpp文件,然后按【Ctrl+o】在打开的窗口中,把tools.lib粘贴到与ttest.cpp同目录之下。
然后,编写测试程序。
#include <iostream> #include <Windows.h> #include "tools.h" using namespace std; int main(void) { cout << add(1, 2) << endl; cout << sub(3, 1) << endl; system("pause"); return 0; }
然后新建一个头文件tools.h。
#pragma once #ifndef _TOOLS_H_ #define _TOOLS_H_ int add(int, int); int sub(int, int); #endif // !_TOOLS_H_
右键单击ttest项目,再点击属性。
选好Release x64后,点击【链接器】,点击【输入】,点击【附加所有项】,在其下拉菜单中,点击【编辑】。
输入tools.lib然后点击确定。再点击【确定】。
右键单击ttest项目,在弹出的菜单中,点击生成。成功生成后,就可以点击“绿色小三角”【编译】了。输出
3 4 请按任意键继续. . .
好的,你已经完成了一个静态库的制作了,如果你还想写更多的函数生成静态库,你可以回到tools项目中修改tools.cpp然后按照上述的步骤,完成静态库的制作(注意:每生成一个静态库,请测试一下!)。
下面是一个小彩蛋:(主要是为了丰富绪论0.1,因为在绪论0.1中笔者并为声明这些字符所占字节是在什么环境中编译的。下面的程序将演示ASCII的0到127的字符打印,一些常用类型的字符长度和最大最小值,使用程序打印系统版本和编译器类型)
主程序:
#include <iostream> #include <cstdio> #include <Windows.h> #include "zifu.h" using namespace std; int main() { zprint(); cout << endl; zcprint(); cout << endl; printf("%d", GetSystemBits()); GetCompilerVer(); GetOsInfo(); system("pause"); return 0; }
头文件:
#pragma once #ifndef _ZIFU_H_ #define _ZIFU_H_ #include<iostream> void zprint(int n = 0, int m = 127); // 打印ASCII码的0-127字符 void zcprint(int z = 1); // 打印常见数据类型的长度和最大最小值 int GetSystemBits(void); // 判断系统位数32 or 64 int GetOsInfo(void); // 系统信息 bool GetCompilerVer(void); // 编译器信息 #endif
源文件见GitHub。运行示例:
NULL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ type: *****************************************size***************************************** bool: 所占字节数:1 最大值:1 最小值:0 char: 所占字节数:1 最大值:127 最小值:-128 signed char: 所占字节数:1 最大值:127 最小值:-128 unsigned char: 所占字节数:1 最大值:255 最小值:0 wchar_t: 所占字节数:2 最大值:65535 最小值:0 short: 所占字节数:2 最大值:32767 最小值:-32768 int: 所占字节数:4 最大值:2147483647 最小值:-2147483648 unsigned: 所占字节数:4 最大值:4294967295 最小值:0 long: 所占字节数:4 最大值:2147483647 最小值:-2147483648 long long: 所占字节数:8 最大值:9223372036854775807 最小值:-9223372036854775808 unsigned long: 所占字节数:4 最大值:4294967295 最小值:0 double: 所占字节数:8 最大值:1.79769e+308 最小值:2.22507e-308 long double: 所占字节数:8 最大值:1.79769e+308 最小值:2.22507e-308 float: 所占字节数:4 最大值:3.40282e+38 最小值:1.17549e-38 size_t: 所占字节数:8 最大值:18446744073709551615 最小值:0 string: 所占字节数:40 type: *****************************************size***************************************** 64 Compiled by VC2015 Windows 8 (null) SP0.0 64位 Version 6.2 Build 9200 请按任意键继续. . .