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);

还有很多特性,这里不一一列举了,大家自行去发掘去做笔记吧。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C99标准是指C编程语言的第三个标准,于1999年发布。它是C语言的一次重要更新,为程序员提供了更多的语言特性和功能。C99标准的PDF文档是C99标准的官方文档,其中包含了C99标准的详细规范和语法描述。 C99标准PDF中的内容主要分为以下几个方面: 1. 语言特性和语法:C99引入了许多新的语言特性,如可变长度数组、布尔类型、复数类型等。PDF文档详细描述了这些特性的语法和使用方法,使程序员能够更好地理解和应用这些特性。 2. 标准库:C99标准还引入了一些新的标准库函数,如对日期和时间的操作、浮点数控制等。PDF文档中对这些函数的使用方法和参数进行了详细说明,方便程序员使用和理解。 3. 编译指令和宏:C99标准增加了一些编译指令和宏定义,如restrict关键字、inline函数、_Pragma宏等。PDF文档中列举了这些指令和宏的用法和语法规则,帮助程序员编写更加高效和灵活的代码。 4. 程序库和头文件:C99标准中定义了一些新增的程序库和头文件,如stdint.h、stdbool.h等。PDF文档中列出了这些库和头文件的功能和使用方法,方便程序员在编程中引用和调用。 通过阅读C99标准的PDF文档,程序员可以深入了解C99标准的各个方面,掌握新的语言特性和功能,以及正确地使用标准库函数和编译指令。这对于编写高效、可靠和规范的C代码是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值