项目开发过程中部分实用C/C++语法总结
1,static函数
被声明为static的函数标识符具有内部链接,换句话说,别的翻译单元无法使用所声明的函数标识符来实现访问该函数。
举例:A_MAIN.h A_MAIN.c / B_MAIN.c
先编写A的h文件和c文件:
//A_MAIN.h
#include"stdio.h"
static void func_A(void);
exstern void func_B(void);
接着是A.c
#include"A_MAIN.h"
static void func_A()
{
return ;
}
void func_B()
{
return ;
}
其次是编写B的h和c文件:
//B_MAIN.h
#include"stdio.h"
#include"A_MAIN.h"
void test_B(void);
接着是B.c
#include"A_MAIN.h"
#include"B_MAIN.h"
void test_B()
{
func_A();
func_B();
}
编译发现,在B的c文件下的test_B报错,报错内容就是关于调用func_A()函数,将这个函数注释掉,再次编译发现通过。这就是本节标题讲到了声明为static的函数具有内部链接。
2,位字段
位字段(bit_field)是一个由具有特定数量的位组成的整体变量,如果连续声明多个小的位字段,编译器会将它们合并成一个机器字(word),这使得小的单元信息具有更加紧凑的储存方式。
位字段的声明表示格式位:
类型[成员名称]:宽度;
类型:
_Bool:布尔类型
int/signed int:有符号类型
unsigned int:无符号类型
成员名称:
成员名称是可选的,但是如果你不写的话,接没有办法获取到他,没有名称的字段主要功能用来填充,保证位集中空间必要顺序。
宽度:
位字段集中该位的占用位的数量,宽度必须是一个常量表达式,并且不能是负值,无名称的位字段的宽度可以是0,这种情况下,下一个声明字段就会从新的可寻址内存单元开始。
举个例子:
struct Pix{
unsigned short par;
unsigned short row;
struct{
unsigned int r : 8;
unsigned int g : 8;
unsigned int b : 8;
}rgb;
}
接下来我们给一张100*100分辨率的彩色图片赋值:
struct Pix pix[100][100];
for(short pars = 0;pars<100;pars++)
for(short rows = 0;rows<100;rows++)
{
pix[par][row].par = par;
pix[par][row].row = rows;
pix[par][row].rgb.r = rand()%255;//产生一个0---254之间的随机数
pix[par][row].rgb.g = rand()%255;
pix[par][row].rgb.b = rand()%255;
}
我们知道,有许多种方法将彩色图片进行分割,其中较为流行的就是RGB和HSV,本实例就是采用RGB方式,且每个通道范围为:0—254,在编写存储彩色图片代码时候,每个通道都用int类型去保存将是极大浪费设备内存。以上方式,在较为清晰表达彩色图片组成结构同时还极大保证了内存单元的连续性。
另外一种用法是在许多标志位储存上:
struct _Bodey_Check{
char name[10];
char age;
struct{
unsigned int Bodey_0 : 1;
unsigned int Bodey_1 : 1;
unsigned int Bodey_2 : 1;
unsigned int Bodey_3 : 1;
unsigned int Bodey_4 : 1;
unsigned int Bodey_5 : 1;
unsigned int Bodey_6 : 1;
unsigned int Bodey_7 : 1;
unsigned int Bodey_8 : 1;
unsigned int Bodey_9 : 1;
unsigned int Bodey_A : 1;
unsigned int Bodey_B : 1;
unsigned int Bodey_C : 1;
unsigned int Bodey_D : 1;
unsigned int Bodey_E : 1;
unsigned int Bodey_F : 1;
}Body_Check_Result;
}
typedef struct Result_num
{
unsigned int results : 1;
char *buffer;
}Result_num;
Result_num Results[] ={
{ 1 , "通过"}
{ 0 , "失败"}
{ 2 , "待测"}
}
/*
typedef struct Check_Result{
char *get_result(char *,char);
Result_num result;
char *result_print;
}check_result;
check_result persion
*/
char *Show_Body_Check_Result(char *names,char organ)
{
char results =2;
for(auto i = 0;(Total_Peoples - i)>=0;i++)
{
if(0 == memcmp(Person[i].name,names,strlen(names)))
{
results = (Person[i].Body_Check_Result >> organ) & 0X01;
break;
}
}
for(auto i = 0;i < sizeof(Results);i++)
{
if(results == Results[i].results)
return Results[i].buffer ;
}
}
//例如:查询张三的第八项体检结果
char *name = "张三";
SHOW(“张三的第8箱体检结果为:%s”,Show_Body_Check_Result(name,8),sizeof(_Bodey_Check.name));
3,指针数组
void (* pSysIoTestFunc[9])(void) =
{
sysIoTest0,
sysIoTest1,
sysIoTest2,
sysIoTest3,
sysIoTest4,
sysIoTest5,
sysIoTest6,
sysIoTest7,
sysIoTest8
};
void sysIoTest8(void)
{
/*********enter your code************/
/************************************/
}
解析:* pSysIoTestFunc[9] 为一个指针数组,数组里面含有9个指针*sysIoTest0(void),且每个指针都指向一个函数 void function(void)的函数。改写这个指针数组为以下:
void (* pSysIoTestFunc[9])(void) = {sysIoTest0 , sysIoTest1 , sysIoTest2 , sysIoTest3 , sysIoTest4 , sysIoTest5 , sysIoTest6 , sysIoTest7 , sysIoTest8 };