容易混淆的几种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
以及百度百科