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的新特性的主要内容,如果未能解决你的问题,请参考以下文章

C99标准的新特性

C99标准新特性的说明

VS2013中C99支持的官方状态是啥?

复合文字(Compound Literals)

C11 标准特性研究

哪个版本的 C 更适合学生学习——C89/90 还是 C99?