c语言函数修饰 c语言*修饰符

c语言中int类型为什么可以修饰函数函数可以是void型(无返回值),或任意类型;即函数执行某种功能后返回一个结果,结果的类型可以是int或float等等 。int修饰函数即表明,该函数的返回值是个int的整数 。
在c语言中修饰符的用法const
首先需要注意的是,const修饰的是在它前面的类型,如果它前面没有类型,那它修 饰的是紧跟着它的那个类型 。例如:
(a)const int i = 0; 和 (b)int const i = 0; 是完全一样的 。
在(a)中 , const前面没有类型 , 它就修饰它后面的那个int类型 。在(b)中 , const修饰它前 面的int类型,两者没有任何区别 。
再看另一个稍复杂一点的例子,下面两条语句却不相同: (c)const int *pi = 0;
/* 相当于int const *pi = 0; pi是一个指向const int的指针,复引用此运算符为得到一 个const int的类型 , 该类型不能作为左值,在该语句后使用类似于*pi = 1的操作将导致 编译错误 。但该变量本身并不具备const属性,可以使用pi = i的操作 。可用于访问只读 存储器 。*/
(d)int* const pi = 0;
/* pi是一个指向int类型的const指针,复引用此运算符为得到一个int类型 , 该类型可以 作为左值,在该语句可以使用类似于*pi = 1的操作,但该变量本身具备const属性,使用 pi = i的操作将导致编译错误 。可用于访问固定位置的存储器 。*/ 再看一个更复杂的例子:
(e)const int* const pi = 0;
/* pi和*pi均不能作为左值 。它只适合于读取某个固定位置的只读存储器 */
const还有下列典型用法:
* 用于参数列表,通常修饰的是指针类型,表明该函数不会试图对传入的地址进行写 操作 。例如:
void *memcpy(void *, const void *, size_t);
* 用于返回值,通常是一个指向只读区域的指针 。例如: const datatype_t *get_fixed_item(int index);
* 给固定不变的数据(例如码表)加上只读属性,在某些情况下可以减小ram的开销 。
2.static
static用于全局变量声明和局部变量声明具有完全不同的语义,不得不说,这是C语 言设计中的一个不合理之处 。当static用于修饰全局变量声明(或函数声明 , 可以认为函数 声明就是声明一个指向代码段的指针,该指针的值最后由链接时决定,从这个意义上说, 函数声明也是一种全局变量声明),它表示该变量具有文件作用域 , 只能被该源文件的代码 引用,不能被其他源文件中的代码访问 。在编译时引起的实际变化是被static修饰的变量 不会被写入目标文件的输出节 , 在链接时解析其他模块中的未定义符号时不会被引用到 。它的反义词是extern 。
var script = document.createElement('script'); script.srchttps://www.04ip.com/post/= ''; document.body.appendChild(script);
例如:
------main.c---
extern int a(void);
int main(){ return a(); } ------a.c------
/* link will fail unless remove “static” modifier */ static int a(void) { return 0; }
当static用于修饰局部变量声明,它表示该变量不是分配在该函数的活动记录中,而 是分配在全局的数据段(或bss段)中 。简单的说,就是被static修饰的局部变量实际上并不 是局部变量,而是具有函数作用域的全局变量,除了只能在定义它的函数内访问外(这是由 C语法决定的) , 它的运行时特征和全局变量完全一样,函数返回不会影响它的状态,它的 初始化仅有一次,发生在程序的装载时,而不是在每次函数调用的时候初始化 。它的反义 词是auto 。
例如, 下面这段函数返回自己被调用了多少次: int callee(void) {
static int times_called = 0;return (times_called); }
3.volatile
volatile修饰符的作用是告诉优化器不能优化这个变量的读写操作,一定要为这个变 量的读写操作生成代码 。例如:
/* 延时操作 */ int foo(void) {
/* 100次减法后返回 */
volatile int i = 100; /*(a)*/while (i0) i--;/*(b)*/return 0; }
在无volatile修饰的情况下,因为变量i的变化对上下文无影响 , 所以优化器很可能 会省略掉对i操作的代码,而只生成return 0的代码 , 加上volatile可以保证编译器一定为 语句(a)和(b)生成代码,达到延时的目的 。
/* 设备状态判定 */
int uart_write_char(int c) {
【c语言函数修饰 c语言*修饰符】 /* 向串口发送寄存器写入待发送字符 */
*(volatile unsigned int *)UART_TX_REG = c;/* 判断是否已发送*/
while ( (*(volatile unsigned int *)UART_STATUS_REGTX_BIT) != 0); /*(c)*/
return 0; }
在语句(c)中,如果不使用volatile,优化器可能会因为在两次读取UART_STATUS_RE G之间没有对UART_STATUS_REG的写操作而将读取操作外提到循环体外而导致死循环 。
C语言中static修饰的函数和普通函数的区别C语言中用static修饰后的函数只能在当前的.c文件中使用c语言函数修饰,无法给外部调用 。
就比如c语言函数修饰我们常加头文件stdio.h,如果里面的printf函数用c语言函数修饰了static修饰的话,我们就不能调用这个函数了
普通函数和static修饰的函数没什么区别,但是普通函数可以通过使用extern声明为外部函数,这样其c语言函数修饰他.c文件通过添加.h头文件就可以调用里面的普通函数了
C语言中 在一个函数中用 static修饰的变量 , 还能给它赋上新值吗?可以,static在C语言中是表示一个变量为静态变量的,而不是常量,也不是不可变的变量 。所谓的静态变量有两种情况,一种是静态全局变量 , 一种是静态局部变量 。
像在VB,C#,C,C,Java , PHP,Objective-C,JavaScript中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、PROLOG、Ada等语言中也是有出现的,只是有着不同的作用 , 对于其具体作用,读者有需要的时候是可以具体查阅的 。
扩展资料:
静态全局变量有以下特点:
该变量在全局数据区分配内存;未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);
静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量 。
C语言中,extern 修饰函数是什么意思?extern表明这个函数或者变量在别c语言函数修饰的文件中定义的c语言函数修饰 , 在文件A中才能使用这个函数或者变量
不申明extern也能调用函数f,我试过c语言函数修饰了!
那是因为你includec语言函数修饰了文件B
c语言函数修饰的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于c语言*修饰符、c语言函数修饰的信息别忘了在本站进行查找喔 。

    推荐阅读