概述
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 中的宏所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复