我是靠谱客的博主 冷静小懒虫,最近开发中收集的这篇文章主要介绍/usr/include/sys/types.h 中的宏,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. #ifdef 与 #if defined
  • 在/usr/include/sys/types.h中有一个宏是这样写的:
#if defined __USE_LARGEFILE64 && !defined __ino64_t_defined
typedef __ino64_t ino64_t;
# define __ino64_t_defined
#endif

第一次看到#if defined有点懵,不明白与#ifdef有什么区别,C语言中文网是这样说的:

  • #if 后面跟的是“整型常量表达式”,而 #ifdef#ifndef后面跟的只能是一个宏名,不能是其他的
  • 后面接的是一个宏的话#ifdef可以认为是 #if defined的缩写

2.##
  • 代码如下
/* For GCC 2.7 and later, we can use specific type-size attributes.  */
# define __intN_t(N, MODE) 
  typedef int int##N##_t __attribute__ ((__mode__ (MODE)))
# define __u_intN_t(N, MODE) 
  typedef unsigned int u_int##N##_t __attribute__ ((__mode__ (MODE)))

# ifndef __int8_t_defined
#  define __int8_t_defined
__intN_t (8, __QI__);
__intN_t (16, __HI__);
__intN_t (32, __SI__);
__intN_t (64, __DI__);
# endif

__u_intN_t (8, __QI__);
__u_intN_t (16, __HI__);
__u_intN_t (32, __SI__);
__u_intN_t (64, __DI__);
  • 关于####的用法可以参考维基百科–预处理指令和宏,总结一下就是
    • 使用#会导致#后面的第一个参数作为带引号的字符串返回
    • 使用####之前的内容与##之后的内容连接起来,也可以使用常量前缀或后缀连接宏参数以获得有效标识符
  • attribute 的语法可以参考官方文档、或简书上的一篇博客
    • 在这段代码中, __attribute __ 用来修饰类型的属性,__mode __属性没有搜索到官方的说明,stackoverflow上有类似的提问,ok,注释也说了可以使用大小属性来修饰这些类型。
    • __intN_t (8, __QI__);展开后变成:
      __int8_t __attribute__ ((__mode__ (__QI__)))
      即指定__int8_t的宽度为最小的可寻址单元的宽度,即8bytes

总之,下面这些类型的大小与编译器无关
int8_t
int16_t
int32_t
int64_t

另外,我在大部分types.h中找到了下面这些类型的定义:

typedef int register_t __attribute__ ((__mode__ (__word__)));
typedef __mode_t 	mode_t;
typedef __ssize_t 	ssize_t;
typedef __pid_t 	pid_t;
typedef __gid_t 	gid_t;
typedef __uid_t 	uid_t;
typedef __id_t 		id_t;
typedef __key_t 	key_t;
typedef __off_t 	off_t;
typedef __daddr_t 	daddr_t;
typedef __caddr_t 	caddr_t;
typedef __nlink_t 	nlink_t;
typedef __loff_t 	loff_t;
typedef __ino_t 	ino_t;
typedef __dev_t 	dev_t;

说明:上述内容为个人总结,如果有错误、不通、不严谨的地方希望留言指出。

最后

以上就是冷静小懒虫为你收集整理的/usr/include/sys/types.h 中的宏的全部内容,希望文章能够帮你解决/usr/include/sys/types.h 中的宏所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部