今天使用 man string 来查看 string 文件的使用的方法(毕竟里面的函数名字和传入参数和发挥参数的类型,如果一段时间不使用,会产生遗忘。)

偶然发现,string.h 的man page 中 出现了 strings.h 的说明。这引起的我的好奇,很奇怪这个strings 和 string 之间的关系。我上网搜了几个帖子,他们写的不够清楚,今天我进行重新整理一下吧:

首先我们看一下man string 里面的内容:

可见,strings 头文件中包含了,部分函数,没有再string.h 中出现的。如图的环境是 macOS Sierra 版本号为:10.12.6

包括; index, rindex, strcasecmp, strncasecmp 这四个函数。

为了一探,这个头文件是不是只有macos 这种 Unix-like 系统中才出现。我在Linux下的ubuntu 系统中也进行了查看。

我们使用命令,man string 命令,同样可见相同的内容。可见它已经是c 标准库中的头文件。

进阶:我们到底该用哪个头文件呢?

为了进一步搞清楚,我们到底在编程的使用string 还是 strings 头文件。我们在 linux 的 /usr/include 文件夹中打开strings 头文件来一窥究竟。

在 strings.h 文件中给了我们明确的答案:

大意为: 如果我们使用了string.h 这个头文件,那么我们不需要在进行包含这个 strings.h 这个文件。除非有一种情况。如果 没有定义 __USE_MISC这个变量,这个变量将会在 strings.h 头文件中进行定义。因为 string.h 中没有进行对这个变量进行定义。具体怎么定义的,大家可以在/usr/include/strings.h 这个文件中进行详细查看。

更进一步:

为了进一步查看社区中的这两个文件的看法,我们在stackoverflow 中 找到了这个话题的讨论。和我们的解释大同小异:

观点1:

strings.h comes from the BSD branch in the unix evolution. Its content has been standardized by POSIX, but most of it is marked as legacy and can be easily replaced with other functions

观点2:

Typically <strings.h> just adds some useful but non-standard additional string functions to the standard header <string.h>. For maximum portability you should only use <string.h> but if you need the functions in <strings.h> more than you need portability then you can use <strings.h>instead of <string.h>.

 具体,这个 strings.h 头文件到底有没有被标准化,我们还需要考证。但是根据两个man page 的表现。我觉得有90% 的可能已经被标准化。因为 mac os 的 man page 中 已经把它归为 Standard C library. strings 与 string.h 不仅仅 只是多一个 s 的区别。
 
结束,欢迎大家留言讨论。欢迎转载,转载时请注明出处
 
参考链接:
1. https://blog.csdn.net/xin_yu_xin/article/details/38672137
2. https://stackoverflow.com/questions/4291149/difference-between-string-h-and-strings-h
3. Linux man page 

strings.h 与 string.h 头文件的区别的更多相关文章

  1. 配置apue的头文件apue.h和unp的头文件anp.h

    配置apue的头文件apue.h和unp的头文件anp.h 如果要使用gcc -g 来生成可调试文件一定要修改Make.defines.linux文件中的CFLAGS变量 修改为:CFLAGS=-an ...

  2. hpp头文件与h头文件的区别

    hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译.而实现代码将直接 ...

  3. 在.h和.cpp中包含头文件的区别

    1.在.h中包含头文件,是为了声明一系列这个头文件的变量等,可能会产生重复包含的问题: 2.在.cpp中包含头文件只是为了实现这个头文件或者使用其中的方法,不会有重复包含的问题,所以尽量在源文件中包含 ...

  4. C++中cstring.h和string.h的区别

    转载:https://blog.csdn.net/qian_chun_qiang/article/details/80648691 1.string与cstring有什么区别 <string&g ...

  5. stdlib.h,string.h,wchar.h的函数列表(cplusplus.com就有,很清楚)goodx

    Multibyte characters mblen Get length of multibyte character (function ) mbtowc Convert multibyte se ...

  6. string所在头文件

    使用string.wstring 头文件:#include <string> 命名空间:std

  7. 【iOS】The differences between Class Extension and Header File 类扩展与头文件的区别

    . As the name suggests, they extend the class. A class continuation is another name. The class exten ...

  8. 头文件string.h中的函数及使用方法

    来源:http://blog.csdn.net/tsyj810883979/article/details/5116817 字符串拷贝1 @函数名称:   strdup函数原型:   char *st ...

  9. 头文件string.h,cstring与string

    string.h string.h是一个C标准头文件,所有的C标准头文件都形如name.h的形式,通过#include <string.h>可以导入此头文件.之后我们就可以在程序中使用st ...

随机推荐

  1. windows安装虚拟主机virtualbox遇到的困难

    本来想到可以在windows安装虚拟主机virtualbox,但是怎么自己的windows是盗版的,由于主题已经被破解了,所以不能安装结果强制性的进入pe然后从网上下载的dll文件复制到 c/wind ...

  2. ASP.NET Web API编程——路由

    路由过程大致分为三个阶段: 1)请求URI匹配已存在路由模板 2)选择控制器 3)选择操作 1匹配已存在的路由模板 路由模板 在WebApiConfig.Register方法中定义路由,例如模板默认生 ...

  3. wordpress怎么禁止文章复制

    登陆你的网站后台--点击菜单栏的"外观"--点击"编辑"--在右侧,找到footer.php,打开它--在</body>之前加入以下代码: 1.禁止 ...

  4. 说说cglib动态代理

    前言 jdk中的动态代理通过反射类Proxy和InvocationHandler回调接口实现,要求委托类必须实现一个接口,只能对该类接口中定义的方法实现代理,这在实际编程中有一定的局限性. cglib ...

  5. Spring Security 入门(1-3-2)Spring Security - http元素 - intercept-url配置

    http元素下可以配置登录页面,也可以配置 url 拦截. 1.直接配置拦截url和对应的访问权限 <security:http use-expressions="false" ...

  6. C# 客户端程序调用外部程序的三种实现

    简介 我们用C#来开发客户端程序的时候,总会不可避免的需要调用外部程序或者访问网站,本篇博客介绍了三种调用外部应用的方法,供参考 实现 第一种是利用shell32.dll,实现ShellExecute ...

  7. python实现归并排序,归并排序的详细分析。

    学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚的 ...

  8. Apache Flink 分布式执行

    Flink 的分布式执行过程包含两个重要的角色,master 和 worker,参与 Flink 程序执行的有多个进程,包括 Job Manager,Task Manager 以及 Job Clien ...

  9. Tomcat NIO

    说起Tomcat的NIO,不得不提的就是Connector这个Tomcat组件.Connector是Tomcat的连接器,其主要任务是负责处理收到的请求,并创建一个Request和Response的对 ...

  10. equals方法的编写建议

    1.显示参数命名为 otherObject ,稍后需要将其转换成另一个叫做 other 的变量. 2.检测 this 与 otherObject 是否引用同一个对象: //这条语句只是一个优化.计算这 ...