从uboot中学习C语言基本功(uboot/lib_generic/vsprintf.c/simple_strtoul)
来源:互联网 发布:网络搭建移动网络 编辑:程序博客网 时间:2024/06/07 19:06
// 此函数有以下几点值得注意:
// 1、第一个参数中的const。一般在函数的形参中,如果我们只是希望调用者使用该参数,而不会去改变该
// 参数内容(一般是指针指向的内容),则可以声明为const。
// 2、第二个参数。C语言中函数只能有一个返回值,但是有时候我们希望从函数中得到不止一个返回内容怎
// 么办呢?只能通过参数了。一般的参数是用来向函数输入信息的,但是指针型参数可以间接用来从函数
// 输出信息。使用时用户只需传入一个相应的指针,函数中会把需要输出的信息地址传给这个指针,这样
// 在函数调用完成后,用户即可到endp指针处去取函数传出的值了。这就是用参数实现返回值的方式。但是
// 要注意,在函数中千万不可把局部变量的地址传给输出型指针,因为局部变量存在栈里,函数调用结束后
// 即释放了,传出的指针指向的内容是栈上已经被释放的部分,因此是无效的。(PS:高级语言中
// 譬如C#有ref,out关键字,以明确指明该引用为输出型)
// 3、第三个参数base。要注意这个base的机制,本函数中是按照这样的理念来设计的。即如果str中有0x
// 开头且接下来是数字则忽略用户调用时输入的base,强制为16进制。如果str不是上面情况然后才看用户
// 输入的base。用户输入非0则使用用户指定的base,若用户输入0则自动判断是8进制还是10进制。
// 需要强调的是:使用习惯决定理念,理念决定代码逻辑。
// 4、注意 if(endp)这里,在输出型参数使用中,函数内首先判断endp是否为NULL,并以此来决定是否输出
// 这个机制来自于一个理念:这个输出参数有可能是用户关注的,也有可能是用户不在意的。这样处理可以
// 给用户自由,即用户如果在意就传一个有效指针过来接收;如果不在意调用时直接给个NULL就行。提供
{
unsigned long result = 0,value;
// 对于base,首先如果*cp以0x开头且下来是数字,则一定为16进制。
// 然后如果用户指定了一个非0的进制,则遵循用户输入的进制。如果用户输入了0进制,则根据是否0开头来
// 确定是8进制还是10进制
if (*cp == '0') {
cp++;
if ((*cp == 'x') && isxdigit(cp[1])) {
base = 16; // 如果cp是0x开头的,下面一个又是数字,那么base一定为16.此时即使
cp++; // 用户输入了一个base,也忽略这个base而强制其为16
}
if (!base) {
base = 8; // 如果用户输入base为0,cp是0开头,接下来不是x,
} // 那么强制为8进制
}
if (!base) {
base = 10; // 如果用户输入base为0,cp是非0开头,则使用10进制。
}
// while循环里value<base是精髓所在。这个解析停止的条件不能是null,而应该是str中第一个不是
// 数字的字母。这个字母的范围取决于base,譬如如果是16进制那么f也算是数字。而如果是8进制那么
// 9都不算是数字了。因此解析结束的范围只能和base比较来限定。
while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
? toupper(*cp) : *cp)-'A'+10) < base) {
result = result*base + value;
cp++;
}
if (endp) // 此处if判断的作用是:用户在使用这个函数时,如果不关心endp则可以直接使用
*endp = (char *)cp; // null,而不必担心程序运行会出错。这种处理技巧很实用,用户可以
return result; // 自行决定是否使用这个函数提供的参数式返回值。
}
// 1、第一个参数中的const。一般在函数的形参中,如果我们只是希望调用者使用该参数,而不会去改变该
// 参数内容(一般是指针指向的内容),则可以声明为const。
// 2、第二个参数。C语言中函数只能有一个返回值,但是有时候我们希望从函数中得到不止一个返回内容怎
// 么办呢?只能通过参数了。一般的参数是用来向函数输入信息的,但是指针型参数可以间接用来从函数
// 输出信息。使用时用户只需传入一个相应的指针,函数中会把需要输出的信息地址传给这个指针,这样
// 在函数调用完成后,用户即可到endp指针处去取函数传出的值了。这就是用参数实现返回值的方式。但是
// 要注意,在函数中千万不可把局部变量的地址传给输出型指针,因为局部变量存在栈里,函数调用结束后
// 即释放了,传出的指针指向的内容是栈上已经被释放的部分,因此是无效的。(PS:高级语言中
// 譬如C#有ref,out关键字,以明确指明该引用为输出型)
// 3、第三个参数base。要注意这个base的机制,本函数中是按照这样的理念来设计的。即如果str中有0x
// 开头且接下来是数字则忽略用户调用时输入的base,强制为16进制。如果str不是上面情况然后才看用户
// 输入的base。用户输入非0则使用用户指定的base,若用户输入0则自动判断是8进制还是10进制。
// 需要强调的是:使用习惯决定理念,理念决定代码逻辑。
// 4、注意 if(endp)这里,在输出型参数使用中,函数内首先判断endp是否为NULL,并以此来决定是否输出
// 这个机制来自于一个理念:这个输出参数有可能是用户关注的,也有可能是用户不在意的。这样处理可以
// 给用户自由,即用户如果在意就传一个有效指针过来接收;如果不在意调用时直接给个NULL就行。提供
// 服务但不强迫,这样很好。在OS的API中很多时候都有类似的技巧,请注意体会。
{
unsigned long result = 0,value;
// 对于base,首先如果*cp以0x开头且下来是数字,则一定为16进制。
// 然后如果用户指定了一个非0的进制,则遵循用户输入的进制。如果用户输入了0进制,则根据是否0开头来
// 确定是8进制还是10进制
if (*cp == '0') {
cp++;
if ((*cp == 'x') && isxdigit(cp[1])) {
base = 16; // 如果cp是0x开头的,下面一个又是数字,那么base一定为16.此时即使
cp++; // 用户输入了一个base,也忽略这个base而强制其为16
}
if (!base) {
base = 8; // 如果用户输入base为0,cp是0开头,接下来不是x,
} // 那么强制为8进制
}
if (!base) {
base = 10; // 如果用户输入base为0,cp是非0开头,则使用10进制。
}
// while循环里value<base是精髓所在。这个解析停止的条件不能是null,而应该是str中第一个不是
// 数字的字母。这个字母的范围取决于base,譬如如果是16进制那么f也算是数字。而如果是8进制那么
// 9都不算是数字了。因此解析结束的范围只能和base比较来限定。
while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
? toupper(*cp) : *cp)-'A'+10) < base) {
result = result*base + value;
cp++;
}
if (endp) // 此处if判断的作用是:用户在使用这个函数时,如果不关心endp则可以直接使用
*endp = (char *)cp; // null,而不必担心程序运行会出错。这种处理技巧很实用,用户可以
return result; // 自行决定是否使用这个函数提供的参数式返回值。
}
- 从uboot中学习C语言基本功(uboot/lib_generic/vsprintf.c/simple_strtoul)
- 从uboot中学习C语言基本功(uboot/lib_generic/vsprintf.c/simple_strtoul)
- uboot-C语言环境初始化
- 嵌入式学习-uboot-lesson9.1-C语言环境初始化
- uboot中C语言代码入口函数(start_armboot)的注释
- uboot中C语言代码入口函数(start_armboot)的注释
- uboot中C语言代码入口函数(start_armboot)的注释
- uboot学习笔记(三)启动源码分析之第二阶段(c语言部分)
- 【C语言】函数指针数组(移植于uboot)
- C语言可变参数vsprintf
- uboot-----borad.c
- uboot-----borad.c .
- uboot-----borad.c . .
- uboot之board.c
- mini6410 uboot board.c 分析
- mini6410 uboot board.c 分析
- UBOOT之main.c分析
- uboot compiled c file list
- struts2中的if/else,iterator标签以及ognl简单使用
- 关于SQL唯一性约束
- Web Service 与 EJB 的分布式的区别
- as3中删除对象的方法
- C# --try catch finally
- 从uboot中学习C语言基本功(uboot/lib_generic/vsprintf.c/simple_strtoul)
- PreparedStatement execute执行插入成功却返回false
- Struts2中的OGNL详解
- C 语言的一些经典题目
- H323与SIP协议对比
- oracle 存储过程基本语法
- 关于几个概念的区分:终端,控制台,shell
- 0x00310030指令引用的0x00310030内存。该内存不能为written
- android动态壁纸--美女报时