C++函数重载
一、函数重载的概念
在实际开发中,有时候我们需要实现几个功能类似的函数,例如把变量的值写入文件,变量的类型可能是int、long、double、char,通过参数把变量传入函数。在C语言中不允许函数同名,程序员只能设计出四个不同名的函数,其函数声明如下:
1234bool writetofile_int(char *filename,int value); // 写入intbool writetofile_long(char *filename,long value); // 写入longbool writetofile_double(char *filename,double value); // 写入doublebool writetofile_char(char *filename,char *value); // 写入char字符串
C语言中函数命名不能重复对程序员是一种负担,编程序的时候需要想象出相近的函数名,调用函数的时候,书写函数名也是一件麻烦的事情。
C++允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载(Function Overloa ...
从C到C++
C读作“C加加”,是“C Plus Plus”的简称,C是在C语言的基础上增加新特性,从语法上看,C语言是C++ 的一部分,C语言代码几乎不用修改就能够以 C++ 的方式编译。
对于C和C的关系,有很多种说法,从表面上看,很容易认为C是C的升级版,C比C高大上,C过时了,有这种想法说明他不了解C/C语言,我们先来看看世界编程语言排行榜,下表是2019的数据(过去十年的数据也大致如此)。
从上表中看出,这个世界上的C程序员比C++程序员多很多。
这么多年了,我也搞不清楚自己是C程序员,还是C++程序员,好像没什么差别。
C有很多新的特征,这些新特征并不一定实用,甚至很烦人。但是,C的开发效率确实比C要高,所以我仍然采用断章取义的方式来介绍C的知识。不管是C还是C,实用就好。
一、C++程序的命名规则
C++头文件一般采用.h后缀,也用有.hpp的。
C程序文件一般采用.cpp后缀,也有用.cc的,建议采用.cpp,C对程序文件的命名没有强制要求,采用.cpp为后缀是大部分程序员的习惯。
二、C++程序的编译
在某些操作系统中,C和C是同一个编译器,在CentOS中,C的编译器是gc ...
C语言makefile文件
在软件的工程中的源文件是很多的,其按照类型、功能、模块分别放在若干个目录和文件中,哪些文件需要编译,那些文件需要后编译,那些文件需要重新编译,甚至进行更复杂的功能操作,这就有了我们的系统编译的工具。
在linux和unix中,有一个强大的实用程序,叫make,可以用它来管理多模块程序的编译和链接,直至生成可执行文件。
make程序需要一个编译规则说明文件,称为makefile,makefile文件中描述了整个软件工程的编译规则和各个文件之间的依赖关系。
makefile就像是一个shell脚本一样,其中可以执行操作系统的命令,它带来的好处就是我们能够实现“自动化编译”,一旦写好,只要一个make命令,整个软件功能就完全自动编译,提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说大多数编译器都有这个命令,使用make可以是重新编译的次数达到最小化。
一、makefile的编写
makefile文件的规则可以非常复杂,比C程序还要复杂,我通过示例来介绍它的简单用法。
文件名:makefile,内容如下:
12345678910all:bo ...
C语言gdb调试
程序员写在编写程序的时候不可能是一帆风顺的,gcc编译器可以发现程序代码的语法错误,但不能发现程序的业务逻辑错误,调试程序是软件开发的内容之一。调试程序的方法有很多种,例如可以用printf语句跟踪程序的运行步骤和显示变量的值,本章节介绍一个功能强大的调试工具gdb。
一、gdb的安装
CentOS系统中,用root用户登录服务器,执行以下命令安装或升级。
1yum -y install gdb
注意,如果您的服务器没有安装gdb,以上命令就会安装最新版本的gdb,如果已经安装了gdb,就会更新到最新版本的gdb,所以,以上命令不管执行多少次都没有问题。
安装gdb,前提条件是服务器必须接入互联网。
二、调试前的准备
用gcc编译源程序的时候,编译后的可执行文件不会包含源程序代码,如果您打算编译后的程序可以被调试,编译的时候要加-g的参数,例如:
1gcc -g -o book113 book113.c
在命令提示符下输入gdb book113就可以调试book113程序了。
1gdb book113
三、基本调试命令
命令
命令 缩写
命令说明
set ...
C语言目录和文件操作扩展
本章节扩展一些目录和文件操作的更多知识,因为这些知识涉及到时间操作,所以放在时间操作之后的章节中介绍。
一、access库函数
access函数用于判断当前操作系统用户对文件或目录的存取权限。
包含头文件:
1#include <unistd.h>
函数声明:
1int access(const char *pathname, int mode);
参数说明:
pathname文件名或目录名,可以是当前目录的文件或目录,也可以列出全路径。
mode 需要判断的存取权限。在头文件unistd.h中的预定义如下:
1234#define R_OK 4 // R_OK 只判断是否有读权限#define W_OK 2 // W_OK 只判断是否有写权限#define X_OK 1 // X_OK 判断是否有执行权限#define F_OK 0 // F_OK 只判断是否存在
返回值:
当pathname满足mode的条件时候返回0,不满足返回-1。
在实际开发中,access函数主要用于判断文件或目录是否是存在。
二、stat库函数
1、stat ...
C语言系统错误
我们在写程序的时候需要调用C语言提供的库函数,并通过函数的返回值判断调用是否成功。其实在C语言中,还有一个全局变量errno,存放了函数调用过程中产生的错误码。
为防止和正常的返回值混淆,库函数的调用一般并不直接返回错误码,而是将错误码(是一个整数值,不同的值代表不同的含义)存入一个名为errno 的全局变量中,errno 不同数值所代表的错误消息定义在 <errno.h>文件中。如果库函数调用失败,可以通过读出 errno的值来确定问题所在,推测程序出错的原因,这也是调试程序的一个重要方法。
配合 strerror和perror两个库函数,可以很方便地查看出错的详细信息。
strerror 在 <string.h> 中声明,用于获取错误码对应的消息描述。
perror 在 <stdio.h>中声明,用于在屏幕上最近一次系统错误码及其消息描述,在实际开发中,我们写的程序运行于后台,在屏幕上显示错误信息没有意义。
一、strerror函数
函数声明:
1char *strerror(int errno);
函数说明:strerror()用来依参数er ...
C语言编译预处理
C语言由源代码生成可执行程序的过程如下:
C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件
其中编译预处理阶段,读取C源程序,对其中的预处理指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。
预处理过程先于编译器对源代码进行处理,读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行转换。预处理过程还会删除程序中的注释和多余的空白字符。
一、预处理指令
在C语言的程序中包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而不是C语言的组成部分,通过预处理命令可扩展C语言程序设计的环境。
预处理指令是以#号开头的代码行,#号必须是该行除了任何空白字符外的第一个字符。
#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符,整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
预处理指令主要有以下三种:
1)包含文件:将源文件中以#include格式包含的文件复制到编译的源文件中,可以是头文 ...
C语言时间操作
UNIX操作系统根据计算机产生的年代和应用采用1970年1月1日作为UNIX的纪元时间,1970年1月1日0点作为计算机表示时间的是中间点,将从1970年1月1日开始经过的秒数用一个整数存放,这种高效简洁的时间表示方法被称为“Unix时间纪元”,向左和向右偏移都可以得到更早或者更后的时间。
在实际开发中,对日期和时间的操作场景非常多,例如程序启动和退出的时间,程序执行任务的时间,数据生成的时间,数据处理的各环节的时间等,无处不在。
在学习时间之前,请把Linux操作系统的时区设置为中国上海时间。
一、time_t别名
在C语言中,用time_t来表示时间数据类型,它是一个long(长整数)类型的别名,在time.h文件中定义,表示一个日历时间,是从1970年1月1日0时0分0秒到现在的秒数。
1typedef long time_t;
二、time库函数
time函数的用途是返回一个值,也就是从1970年1月1日0时0分0秒到现在的秒数。
time函数是C语言标准库中的函数,在time.h文件中声明。
1time_t time(time_t *t);
time函数有两种调用方法 ...
C语言目录操作
目录的操作不论是在嵌入式还是应用软件编程都是必不可少的,不同的开发语言可能略有不同,本章节主要是讨论在Linux系统下目录的一系列操作,以我的个人经验,创建目录和列出目录中的文件这两个功能用得最多。
一、获取当前工作目录
在shell中我们可以直接输入命令pwd来显示当前的工作目录,在C程序中调用getcwd函数可以获取当前的工作目录。函数声明:
1char * getcwd(char * buf,size_t size);
getcwd函数把当前工作目录存入buf中,如果目录名超出了参数size长度,函数返回NULL,如果成功,返回buf。例如:
1234char strpwd[301];memset(strpwd,0,sizeof(strpwd))getcwd(strpwd,300);printf("当前目录是:%s\n",strpwd);
二、切换工作目录
函数声明:
1int chdir(const char *path);
就像我们在shell中使用cd命令切换目录一样,在C程序中使用chdir函数来改变工作目录。
返回值:0-切换成功;非0-失败。
...
C语言文件操作
对计算机来说,一切皆数据,超女的信息是数据、C语言源代码文件是数据、编译后的可执行程序也是数据,数据的存放方式有很多种,如内存、文件、数据库等,文件是极其重要的一种。
根据文件中数据组织形式的不同,可以把文件分为文本文件和二进制文件,C语言源代码是文本文件,编译后的可执行程序是二进制文件。
一、文本数据和二进制
1、文本数据
文本数据由字符串组成,存放了每个字符的 ASCII码值,每个字符占一个字节,每个字节存放一个字符。
例如数字 123,如果用文本格式存放,数据内容是’1’、‘2’、'3’三个字符,占三个字节,如下表所示。
字符
‘1’
‘2’
‘3’
ASCII(十进制)
49
50
51
ASCII(二进制)
00110001
00110010
00110011
2、二进制数据
二进制数据是字节序列,数字123的二进制表示是01111011,如果用二进制格式形式存储,字符、短整型、短整型、长整型都可以存储123,存储方式分别如下:
1)字符型一个字节
101111011
2)短整型2个字节
100000000 01111011
3)整型4个字节
1 ...