原副标题:撷取7个庞克PDPC高阶关键点,码住!
01
void 与 void*
C词汇中,void为不确认类别,无法用以新闻稿表达式。如void a=10;是错的。但能把操作符表述为void类别,如void* ptr。
void*是常量未确认的操作符类别。通常用在auth、表达式codice中须要相容相同操作符类别的地方性;void*类别表达式能拒绝接受任一类别操作符的表达式,因此不须要展开强制性类别转换。void*能表达式给任何人类型的表达式,但须要强制性类别转换结论才有象征意义。
比如:
void* a=NULL;
int* b=NULL;
a=b;
int*a=NULL;
void *b=NULL;
a=(int*)b;
02
volatile 关键字
volatile能看作是synchronized的一类轻量的同时实现,但volatile并无法全然替代synchronized,volatile有synchronized由此可见性的优点,但没synchronized氢原子性的优点。由此可见性即用volatileURL润色的核心成员表达式说明该表达式不存有组织工作缓存的复本,缓存每天间接都从主缓存中加载,每天加载的都是新一代的值,这也就保证了表达式对其它缓存的由此可见性。除此之外,采用volatile还能保证表达式无法被重次序,保证了Roybon。
03
数据占用大小
数据占用大小是指相同的数据类别在平台中所占用的字节个数,相同的平台相同类别占用的字节个数稍有相同,不过在对应的平台展开开发过程中,必须要对每个数据类别的占用大小了如指掌,否则各种数据溢出,数据越界等等接踵而来。下面是简单罗列的一些数据占用情况:(在通常32位PC中)
char
8bit
short
16bit
int
32bit
long
32bit
float
32bit
double
64bit
04
const 与操作符
我们知道constURL润色的是不可表达式,将它和操作符一起采用,会有很多微妙的地方性。主要的识别办法是去掉数据类别,看const润色的是哪部分。
关于采用const来润色操作符,有两种相同的方式。第一类是让操作符指向一个常量对象,这样能防止采用该操作符展开修改指向的值。第二种则是将操作符本身新闻稿为常量,能防止改变操作符指向的位置。
05
结构体与共联体
对于结构体和共联体在PDP领域是采用得非常频繁的,一些可编程芯片提供的寄存器库都是采用结构体和共联体结合的方式来提供给软件人员展开开发,同时在平时的编码过程中这两个数据类别的灵活应用也能够同时实现代码更好的封装与简化。
如下面的简单示例,就能非常灵活的访问Val中的bit位。
typedef union
{
BYTE Val;
struct __packed
{
BYTE b0:1;
BYTE b1:1;
BYTE b2:1;
BYTE b3:1;
BYTE b4:1;
BYTE b5:1;
BYTE b6:1;
BYTE b7:1;
} bits;
}BYTE_VAL, BYTE_BITS;
06
预表述标识符
通常编译器都支持预表述标识符,这些标识符结合printf等打印信息帮助程序员调试程序是非常有用的,通常编译器会自动根据用户指定完成替换和处理。
如下是常用的标识:
__FILE__ :表示展开编译的源文件字符串;__LINE__ :表示当前文件的行号;
__DATE__:表示文件日期;
__TIME__ :表示文件时间;
采用范例:
printf(“file:%s\n line:%d \n data:%s \n time: %s
07
# 与 ##
#:是一类运算符,用于带参宏的文本替换,将跟在后面的参数转成一个字符串常量。
##:是一类运算符,是将两个运算对象连接在一起,也只能出现在带参宏表述的文本替换中。
#define STR(s) #s
#define COMB(str1,str2) str1##str2
int main()
{
int UART1= 57600;
printf(“%d\n”, COMB(UART, 1));
printf(“%s\n”, STR(3.1415));
return
}
以上总结的这些PDPC高阶的7个关键点, 希望能对大家有所帮助。