C99的新特性
Posted 嵌入式软件实战派
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C99的新特性相关的知识,希望对你有一定的参考价值。
C99
现在的C++都更新到C++11,C++14,C++17,C++20了,C语言也有C11,C17……但是对于嵌入式C开发,很多IDE的编译器还是只支持C99.
这也就算了,还有很多程序员停留在使用C90的C语言风格,现在讲讲C99的特性
预处理
C语言的预处理(常说的宏定义)部分也有很多更新。
我之前专门对C99的预处理做了个完整的总结,请见《基于C99规范,最全C语言预处理知识总结》
单行//
注释
看到这个,也许你很疑惑,从小到大我都用//
做注释啊,你说C99之后才支持?
不信,你试试这个:
int main(void)
int x=123;
// x=456;
printf("x=%d",x);
return 0;
gcc c99.c -std=c90
c99.c: In function 'main':
c99.c:6:5: error: C++ style comments are not allowed in ISO C90
// x=456;
^
c99.c:6:5: error: (this will be reported only once per input file)
//
本来是C++的注释规范,C语言的C90以前版本是不支持的。如果你用C90页支持//
,有可能是IDE或所用的编译器自己添加的。
结构体初始化
你还在用着老土的结构体初始化方式吗?
struct int x, y; a[10] = 1, 12 ;
其实你可以这样啦
struct int x, y; a[10] = [3] = .y = 12, .x = 1 ;
然后,像下面这样用起来不香吗!
enum Iron = 26, Aluminium = 13, Beryllium = 4, ... ;
const char *element_names[] =
[Iron] = "Iron",
[Aluminium] = "Aluminium",
[Beryllium] = "Beryllium",
...
;
变量定义的位置
以往,写代码,函数里的变量定义一定要写在前面,看着C++的可以随便位置定义,C语言用着很憋屈。
于是C99之后,变量也可以随意位置定义了,例如可以在for
循环括号里面定义变量。
int a = 0;
a = 1;
for(int i = 0; i < 100; i++)
a += i;
C90是不支持的,编译时会产生以下错误:
gcc c99.c -std=c90
c99.c: In function 'main':
c99.c:7:5: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for(int i = 0; i < 100; i++)
^~~
c99.c:7:5: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
stdint.h
基本类
写代码的时候,不想写长长的unsigned char
,于是要自定义一个uint8_t
,现在C99不需要了,有这个stdint.h
头文件就行了。
以后代码移植也不用操心这事了,int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t
…通通都有。例如
uint32_t truth = 0xDECAFBAD;
可变长度数组VLA
C99支持数组定义时,长度可以是一个变量。
int x;
scanf("%d", &x);
int a[x];
for (int i = 0; i < x; ++i)
a[i] = i * i;
for (int i = 0; i < x; ++i)
printf("%d\\n", a[i]);
柔性数组
什么是柔性数组?最简单直接的理解就是结构体里面有个长度为0的数组。干啥用?看看这个例子:
typedef struct
int len;
char buf[];
buffer;
int bufsize = 100;
buffer *b = malloc(sizeof(buffer) + sizeof(int[bufsize]));
支持布尔类型bool
以往C语言的布尔类型,要自己定义,而且看起来很山寨。
#define bool unsigned char
typedef unsigned char bool;
现在的C99可以直接用bool
,不用自定义了
内联函数inline
用过C++的都懂,inline
可以提高运行效率,而且又有函数的特性,C语言羡慕不已,老是想着模仿,现在C99可以光明正大地写了
inline void set_value(int val);
还有很多特性,这里不一一列举了,大家自行去发掘去做笔记吧。
以上是关于C99的新特性的主要内容,如果未能解决你的问题,请参考以下文章