c语言可重入函数使用方法,哪些函数是可重入函数-成都快上网建站

c语言可重入函数使用方法,哪些函数是可重入函数

static这个函数

static 是C中很常用的修饰符,它被用来控制变量的存储方式和可见性

创新互联公司自2013年起,先为鄞州等服务建站,鄞州等地企业,进行企业商务咨询服务。为鄞州企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

static 声明的变量在C语言中有两方面的特征:

1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

2、问题:Static的理解

关于static变量,请选择下面所有说法正确的内容:

A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;

D、静态全局变量过大,可那会导致堆栈溢出。

答案与分析:

对于A,B:根据本篇概述部分的说明b),我们知道,A,B都是正确的。

对于C:根据本篇概述部分的说明a),我们知道,C是正确的(所谓的函数重入问题,下面会详细阐述)。

对于D:静态变量放在程序的全局数据区,而不是在堆栈中分配,所以不可能导致堆栈溢出,D是错误的。

因此,答案是A、B、C。

3、问题:不可重入函数

曾经设计过如下一个函数,在代码检视的时候被提醒有bug,因为这个函数是不可重入的,为什么?

unsigned int sum_int( unsigned int base )

{

unsigned int index;

static unsigned int sum = 0; // 注意,是static类型的。

for (index = 1; index = base; index++)

{

sum += index;

}

return sum;

}

答案与分析:

所谓的函数是可重入的(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。

这个函数之所以是不可预测的,就是因为函数中使用了static变量,因为static变量的特征,这样的函数被称为:带“内部存储器”功能的的函数。因此如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量,这种函数中的static变量,使用原则是,能不用尽量不用。

将上面的函数修改为可重入的函数很简单,只要将声明sum变量中的static关键字去掉,变量sum即变为一个auto 类型的变量,函数即变为一个可重入的函数。

当然,有些时候,在函数中是必须要使用static变量的,比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

C语言可重入函数应该注意哪些事项

如果只读,那怎么用都行。如果有写的操作,最好避开,实在避不开就要用信号量等机制防止多线程冲突。

另外就是调用的函数要线程安全, thread-safe.具体那些函数线程安全,需要查阅手册。

华为c语言编程规范是怎样的

代码总体原则

清晰第一。清晰性是易于维护、易于重构的程序必须具备的特征。

简洁为美。简介就是易于理解并且易于实现。

选择合适的风格,与源代码风格保持一致。

头文件

头文件的设计体现了大部分的系统设计,不合理的头文件布局是编译时间过长的根因,实际上是不合理的设计。

头文件中适合放置接口的声明,不适合放置实现。

头文件应当职责单一。

头文件应向稳定的方向包含。

每一个.c文件应有一个同名的.h文件,用于声明需要对外公开的接口。

禁止头文件循环依赖。

禁止包含用不到的头文件。

头文件应当自包含。

编写内部#include保护符(#define保护)。

禁止在头文件中定义变量。

只能通过包含头文件的方式使用其他C提供的接口,禁止在C中通过extern的方式使用外部函数接口和变量。

禁止在extern "C"中包含头文件。

函数

函数设计的精髓:编写整洁函数,同事把代码有效组织起来。

一个函数仅完成一个功能。

重复代码应该尽可能提炼成函数。

避免函数过长,新增函数不超过50行。

避免函数的代码块嵌套过深,新增函数的代码块嵌套不超过4层。

可重入函数应避免使用共享变量;若需要使用,则应该通过互斥手段对其加以保护。

对参数的合法性检查,由调用者负责还是接口函数负责,应在项目组模块内统一规定。缺省由调用者负责。

对函数的错误返回码要全面处理。

设计高扇入,合理扇出(小于7)的函数。扇出是指调用其它函数的数目。扇入是指有多少上级函数调用它。

废弃代码要及时清除。

函数参数不变使用const限定。

函数应避免使用全局变量、静态局部变量和I/O操作,不可避免的地方应集中使用。

检查函数所有非参数输入的有效性,如数据文件、公共变量等。

函数的参数个数不超过5个。

在源文件范围内声明和定义的所有函数,除非外部可见,否则应该加static关键字。

标识符

标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。

产品、项目组内应保持同意的命名分格。

尽量避免名字中出现数字编号,除非逻辑上确实需要。

重构、修改部分代码时,应该保持和原有代码风格一致。

文件命令统一采用小写字符。因为不同系统对文件名大小写处理会有不同(windows不区分大小写,但是linux系统则区分)。

全局变量应增加“g_”前缀。

静态变量应增加“s_”前缀。

禁止使用单字节命名变量,但是允许定义i,j,k作为局部循环变量。

不建议使用匈牙利命名法。

对于数值或者字符串常量的定义,建议采用全大写字母,单词之间加下划线的方式命名。

变量

结构功能单一,不要设计面面俱到的数据结构。

不用或者少用全局变量

防止局部变量与全局变量同名

通讯过程中使用的机构,必须注意字节序。

严禁使用未经初始化的变量作为右值。

使用面向接口编程思想,通过API访问数据。

尽量减少没有必要的数据类型默认转换与强制转换。

宏和常量

用宏定义表达式时,要使用完备的括号。

将宏定义的多条表达式放在大括号中。

使用宏时,不允许参数发生变化。

不允许直接使用魔鬼数字。

除非必要,应尽可能使用函数代替宏。

常量建议用const定义代替宏。

质量

时刻注意易混淆的操作符

必须了解编译系统的内存分配方式,特别是编译系统对不同类型的变量的内存分配规则,如局部变量在何处分配、静态变量在何处分配等。

不仅关注接口,同样要关注实现。

禁止内存操作越界。

禁止内存泄漏。

禁止引用已经释放的内存空间。

编程时,要防止差1错误。

switch语句必须有default分支。

函数中分配的内存,在函数退出之前要释放。

不要滥用goto语句。

时刻注意表达式是否会上溢、下溢。

程序效率

在保证软件系统的正确性、简洁、可维护性、可靠性及可测试性的前提下,提高代码的效率。

通过对数据结构、程序算法的优化来提高效率。

将不变条件的计算移到循环体外。

对于多维大数组,避免来回跳跃式访问数组成员。

创建资源库,以减少分配对象的开销。

将多次被调用的“小函数”改为inline函数或者宏实现。

注释

优秀的代码可以自我解释,不通过注释即可轻易读懂。

注释的内容要清楚、明了,含义准确,防止注释二义性。

修改代码时,维护代码周边的所有注释,以保证注释与代码的一致性。不再有用的注释要删除。

文件头部应进行注释,注释需要列出:版权说明、版本号、生成日期、作者姓名、工号、内容、功能说明、与其他文件的关系、修改日志等,头文件的注释中还应有函数功能的说明。

函数声明处注释描述函数功能、性能及用法,包括输入和输出参数、函数返回值、可重入的要求等;定义处详细描述函数功能和实现要点,如实现的简要步骤、实现的理由、设计约束等。

全局变量要有详细的注释,包括对其功能、取值范围以及存取时注意事项等的说明。

尽量采用工具可以识别的格式注释。

排版与格式

程序块采用缩进风格编写,每级缩进为4个空格。

相对独立的程序块之间、变量说明之后必须加空行。

一行只写一条语句。

对等操作两边加空格,注释符与内容之间加空格。

编译

使用编译器的最高告警级别,理解所有的告警,通过修改代码而不是降低告警级别来消除所有告警。

在产品软件中,要统一编译开关、静态检查选项以及相应告警清除策略。

可测性

模块划分清晰,接口明确,耦合性小,有明确输入和输出,否则单元测试实施困难。

在统一项目组或产品组内,调测打印的日志要有统一的规定。

使用断言记录内部假设。

不能用断言来检查运行时错误。

什么是C语言的可重入函数?怎么使用?

假如,main()中正在调用A()函数.在此期间,有一中断,在中断服务程序中还要调用A().

如果这个A()可以被调用就算是可重入

反之算不可重入.

可重入与不可重入的区别在这个函数的内容是否会相互冲突...例如A()中有个静态变量...就不可以..

什么是可重入程序?举出一个不重入程序的例子

若一个程序或子程序可以安全的被并行执行,则称其为可重入(reentrant或re-entrant)的;即,当该子程序正在运行时,可以再次进入并执行它。若一个函数是可重入的,则该函数:不能含有静态(全局)非常量数据。 不能返回静态(全局)非常量数据的地址。 只能处理由调用者提供的数据。 不能依赖于单实例模式资源的锁。 不能调用不可重入的函数。 多'用户/对象/进程优先级'以及多进程一般会使得对可重入代码的控制变得复杂。同时,IO代码通常不是可重入的,因为他们依赖于像磁盘这样共享的、单独的资源。可重入性是函数编程语言的关键特性之一。 例子在以下的C语言代码中,函数f和函数g都不是可重入的。int g_var = 1;int f(){ g_var = g_var + 2; return g_var;}int g(){ return f() + 2;}以上代码中,f使用了全局变量 g_var,所以,如果两个线程同时执行它并访问g_var,则返回的结果取决于执行的时间。因此,f不可重入。而g调用了f,所以它也不可重入。稍作修改后,两个函数都是可重入的:int f(int i){ return i + 2;}int g(int i){ return f(i) + 2;}

C语言中怎样调用函数(举个例子)

C语言中调用函数的方法及步骤:

工具/原料:C语言

1、首先需要输入想要调用的函数。

2、然后当输入一个括号后,即可观察他的参数。

3、接着在对应的参数中输入参数值。

4、然后,系统会发生一个警告。

5、接着需要调用它相应的头文件。

6、最后再次编译,发现没有任何警告和错误即可。


网页名称:c语言可重入函数使用方法,哪些函数是可重入函数
文章位置:http://kswjz.com/article/heesjd.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流