容易混淆的几种C关键字定义

今天想说下几种C中关键字的前缀定义,因为工作中实际用到了并且踩了坑,所以记录一下供参考。
C语言关键字在这里插入图片描述
着重说下,static,extern,const,inline,volatile,这是经常用到但是也被经常忽略的几个

1.static

静态局部变量
【1.c】
int a;
void func()
{
static int b;
}
b是静态局部变量,只能在1.c的func中调用

静态全局变量
【1.c】
static int a;
void func()
{
static int b;
}
a是静态全局变量,只能在1.c中使用

静态函数
【1.c】
static func()
{
int a;
static b;
}

【2.c】
include “1.h”
func2()
{
func();
}
此时程序会报错,2.c中无法调用静态函数,func()只能在1.c中被调用

2.extern
extern变量
例:
【1.c】
int a=0;

【2.c】
extern a;
func(a);// use a

或者,在2.c中将extern a的声明包含在头文件中,那么n.c调用时包含头文件即可

extern函数
全局函数的声明与变量类似

3.const
const的四种用法

①const普通变量
例如:
const int a = 10;
则a的值不允许被修改,任何尝试修改的行为都会被报错

②const指针与指向const的指针
char a[10]={0};
char b[10]={0};
const char *p; //指向const的指针p,p可以改变,p指向的内容不能改变
or
char const *p;//效果同上
*p = a[0];//p指向的值将一直为a[0]

char * const p = a;//p是const指针,p不可以改变,但是p指向的内容可以改变,且定义时必须初始化

const char * const p = a;
char const* const p =a;//这两种写法,指的是p不可以改变,p指向的内容也不允许改变

③const函数形参
用const限制函数的入参,是const用的较多的地方
例:
func(const char *p){}
这是传入的p指向的内容便不可以被修改,较常见的是对字符串的个数统计,截取等操作,一般是不希望修改源字符串,这时便可以用const加以限定

④const与非const的转换
char *p;
const char q;
p = (const char
)q;//为了直观,带上强转,编译器会报错,const不允许转为非const

q = (char *)p;//此时是把非const转化为const,允许操作,注意此时p指向的内容将会被限制

4.inline
这个是我项目中真实踩过的坑,当时linux平台下有x86和xlp两种编译,在不同的文件中定义了相同函数名的函数,加了inline关键字,结果x86可以正常编译,xlp编译失败。
inline有点类似于define的作用,在文本中展开定义的函数体,而不是以函数调用的方式执行,以空间换效率。
一般与static一起使用。单独使用时多个文件包含inline关键字,编译器会报错,但是之前x86编译未报错可能是编译器优化的原因,mips编译提示重复定义。

5.volatile
volatile int a;
提示编译器,该变量不用优化,该变量的值容易变化。
例如
int a;
a =1;
a= 2;
a =3;

volatile int a ;
a = 1;
a =2;
a =3 ;
上面一种a的值为3,下面一种a的值为3,区别在于上面的值被优化,a直接被赋予3的值,而下面的未经过优化,a的值分别被赋予1,2,3的值。
这种用法多用于寄存器操作,以及端口操作中

引用:https://www.cnblogs.com/zhangjiansheng/p/6527708.html
https://www.cnblogs.com/JMatrix/p/8194009.html
https://www.cnblogs.com/xkfz007/articles/2370640.html
以及百度百科

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值