如何在Linux下查找一个类型的定义



对于赶时间的朋友,只看第一段就好了。

   首先,我非常肯定以及确定的告诉你ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与long int,有没有注意到,它和long数据类型有啥区别?其实就是一样的。size_t 就是无符号型的ssize_t,也就是unsigned long/ unsigned int (在32位下),不同的编译器或系统可能会有区别,主要是因为在32位机器上int和long是一样的。在64位没有测试,但是参见百度百科,size_t 在64位下是64位,那么size_t的正确定义应该是typedef unsigned long size_t。


ssize_t:


    前一阵子,上Unix程序设计,问老师说ssize_t到底是什么数据类型,老师说,你直接用就好了,真要知道是什么数据类型,可以去types.h里去看一下,回去以后找了一下没有找到就放弃了,今天写代码又遇到这个问题,我觉得不是办法,还是得弄清除它到底是什么类型。当然了,对于ssize_t到底是什么数据类型,不知道问题也不大,但是对于控制欲强和好奇心重的人,总是想知道的,而且我相信,知道了总会有好处的,写代码的时候心里有底。

查找步骤:

    1. 包含头文件的时候是这么做的:#include <sys/types.h>,执行locate types.h跳出一堆文件,这也是为什么我第一次尝试失败的原因。首先执行locate sys/types.h,就可以找到types.h的存放位置了。

    2. 打开types.h,搜索 ssize_t,得到如下结果

#ifndef __ssize_t_defined
typedef __ssize_t ssize_t;
# define __ssize_t_defined

    3. 再搜索__ssize_t 就找不到任何有价值的信息了,观察文件发现,该文件还包含了其他头文件,也就是 #include <bits/types.h>,再次打开bits/types.h

    4. 搜索__ssize_t 找到了这么一条语句:__STD_TYPE __SSIZE_T_TYPE __ssize_t; 搜索__STD_TYPE_SSIZE 又找到了这样一句话:

/* We want __extension__ before typedef's that use nonstandard base types
   such as `long long' in C89 mode.  */
# define __STD_TYPE             __extension__ typedef

也就是说,__STD_TYPE __SSIZE_T_TYPE __ssize_t;这条语句其实就是 typedef __SSIZE_T_TYPE __ssize_t,那么重点就是找到__SSIZE_T_TYPE了,搜索__SIZE_T_TYPE,又没有什么有价值的信息了,与步骤3类似,我们又找到了这条语句:#include <bits/typesizes.h>  ,打开typesizes.h文件,搜索__SSIZE_T_TYPE,很轻松的就找到了#define __SSIZE_T_TYPE          __SWORD_TYPE,也就是说最开始的 __STD_TYPE __SSIZE_T_TYPE __ssize_t; 这条语句其实就是 typedef __SWORD_TYPE  __ssize_t,typesize.h文件里找不到__SWORD_TYPE,于是我们又回到了bit/types.h中,结果终于出现了。

    5.在bit/types.h中很轻松的就找到了下面这几行语句。

#if __WORDSIZE == 32
# define __SQUAD_TYPE           __quad_t
# define __UQUAD_TYPE           __u_quad_t
# define __SWORD_TYPE           int
# define __UWORD_TYPE           unsigned int
# define __SLONG32_TYPE         long int
# define __ULONG32_TYPE         unsigned long int
# define __S64_TYPE             __quad_t
# define __U64_TYPE             __u_quad_t
/* We want __extension__ before typedef's that use nonstandard base types
   such as `long long' in C89 mode.  */
# define __STD_TYPE             __extension__ typedef
#elif __WORDSIZE == 64
# define __SQUAD_TYPE           long int
# define __UQUAD_TYPE           unsigned long int
# define __SWORD_TYPE           long int
# define __UWORD_TYPE           unsigned long int
# define __SLONG32_TYPE         int
# define __ULONG32_TYPE         unsigned int
# define __S64_TYPE             long int
# define __U64_TYPE             unsigned long int
/* No need to mark the typedef with __extension__.   */
# define __STD_TYPE             typedef
#else
# error
#endif

       我们几乎都可以猜到__WORDSIZE是什么意思了,它的定义在#include <bits/wordsize.h>中,表示计算机系统是几位的。从上面我们知道,在32位计算机系统中,ssize_t 是int型,占4个字节,在64位计算机系统中,ssize_t是long int 型,占8个字节。


size_t:


    晕,size_t的资料居然找了半天。size_t大家都知道,是无符号整型,在/usr/include/i386-linux-gnu/sys/stddef.h下看到这么几条语句:

/* __size_t is a typedef on FreeBSD 5!, must not trash it. */
#else
#define __size_t
#endif
#ifndef __SIZE_TYPE__
#define __SIZE_TYPE__ long unsigned int
#endif
#if !(defined (__GNUG__) && defined (size_t))
typedef __SIZE_TYPE__ size_t;
#ifdef __BEOS__
typedef long ssize_t;

可以肯定的是,size_t是无符号整型,至于是long型,还是int型,可能不同的编译器有不同的定义,我这里没有64位的机器,无法验证。这也验证了我们上面所说的ssize_t其实就是一个long。

下面的是一点附加资料,证明我找到的是正确的。:-)

    一个基本的无符号整数的C / C + +类型。 它是sizeof操作符返回的结果类型。 该类型的大小是选择,因此,它可以存储在理论上是可能的任何类型的数组的最大大小。 在32位系统为size_t将采取32位和64位 - 64位。

参考资料:http://baike.baidu.com/view/3236587.htm

Data Type: ssize_t         This data type is used to represent the sizes of blocks that can be read or written in a single operation. It is similar to size_t, but must be a signed type. 参考资料: http://www.delorie.com/gnu/docs/glibc/libc_239.html
<think>好的,我现在需要回答用户关于在Linux系统中如何定位变量定义的问题。首先,用户提到他们想在Linux环境下查找变量的定义,特别是变量声明的位置。我需要结合提供的引用内容,给出几种方法。 首先,根据引用[4],用户提到ctags可以用来查找函数定义,但无法反向查找调用处。而cscope可以弥补这一点。不过用户的问题是关于变量的定义,所以可能需要使用类似工具。 接下来,查看引用[5],其中提到在进程上下文中获取环境变量的方式,比如getenv和extern char** environ。这可能与用户的问题相关,但用户问的是查找变量声明的位置,可能是在代码中查找,而不是环境变量。不过用户之前提到的引用中有关于环境变量的内容,可能需要确认用户指的是环境变量还是代码中的变量。 假设用户是指代码中的变量定义,那么需要推荐代码分析工具。例如,ctags和cscope可以用来在源代码中查找变量定义。例如,使用ctags生成标签数据库,然后在vim中使用跳转命令。而cscope支持更复杂的查询,包括符号的定义和引用。 另外,grep命令也是一个基本的方法,可以搜索整个代码库中的变量名,但可能不够精确,因为可能匹配到注释或其他地方。 如果用户指的是环境变量,比如PATH或HOME,根据引用[1][2][3],可以使用echo $VARIABLE_NAME或printenv命令查看当前设置的值,但查找定义的位置可能需要查看shell配置文件如.bashrc、.profile或/etc/environment等。 需要进一步明确用户的需求,但根据问题中的“查找变量声明的位置”和引用[4][5],可能更多指代码中的变量。因此,综合以上信息,应该分情况回答:代码中的变量使用ctags/cscope/grep,环境变量使用printenv和检查配置文件。 同时,用户可能需要具体的步骤和示例命令,比如如何生成tags文件,如何使用cscope查找变量。还要注意引用相关的资料,如引用[4]提到的cscope,引用[5]提到的环境变量获取方法。 最后,生成相关问题,可能涉及工具比较、环境变量设置位置、代码中查找函数调用等。</think>在Linux系统中定位变量定义的位置,需根据变量类型(代码变量或环境变量)选择不同方法。以下是具体步骤: ### 一、代码中的变量定义查找 1. **使用ctags工具** 生成代码索引数据库后,在Vim中快速跳转到定义位置: ```bash ctags -R . # 递归生成当前目录的tags文件 ``` 在Vim中,将光标置于变量名上,按`Ctrl+]`跳转到定义,`Ctrl+t`返回[^4]。 2. **使用cscope增强查询** cscope支持变量/函数的定义和引用双向查找: ```bash cscope -Rbkq # 生成交叉引用数据库 ``` 在Vim中使用`:cs find g 变量名`查找定义,`:cs find c 变量名`查找调用处。 3. **grep命令全局搜索** 直接搜索包含变量声明的文件: ```bash grep -rnw '/path/to/code' -e 'int my_variable' # 精确匹配声明语句 ``` ### 二、环境变量的定义查找 1. **查看定义的环境变量值** 使用`printenv`或`echo`查看当前值: ```bash echo $PATH # 输出PATH的值[^1] printenv HOME # 显示用户家目录路径[^3] ``` 2. **定位环境变量定义位置** - **用户级配置**:检查`~/.bashrc`、`~/.bash_profile`或`~/.profile` - **系统级配置**:检查`/etc/environment`、`/etc/profile.d/`目录下的脚本[^2] - **临时变量**:通过`export`命令直接设置(仅在当前会话有效) 3. **通过代码获取环境变量** 在C程序中可使用`getenv()`函数: ```c #include <stdlib.h> char *path = getenv("PATH"); // 获取PATH环境变量[^5] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值