zoukankan      html  css  js  c++  java
  • GNU C 与 ANSI C(上)

    Linux 上可用的 C 编译器是 GNU C 编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。GNU C 是对标准 C 进行的一系列扩展,以增强标准 C 的功能。

    1. 零长度和变量长度数组

    GNU C 允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用。例如:

    struct var_data {
        int len;
        char data[0];
    };
    

    char data[0] 仅仅意味着程序中通过 var_data 结构体实例的 data[index] 成员可以访问 len 之后的第 index 个地址,它并没有为 data[] 数组分配内存,因此 sizeof(struct var_data) = sizeof(int)。

    假设 struct var_data 的数据域就保存在 struct var_data 紧接着的内存区域,则通过如下代码可以遍历这些数据:

    struct var_data s;
    ...
    for(i=0; i<s.len; i++)
        printf("%02x", s.data[i]);
    

    GNU C 中也可以使用一个变量定义数组,例如下面代码中定义的 “double x[n]”:

    int main(int argc, char *argv[])
    {
        int i, n = argc;
        double x[n];
    
        for(i=0; i<n; i++)
            x[i] = i;
    
        return 0;
    }
    

    2. case 范围

    GNU C 支持 case x...y 这样的语法,区间 [x, y] 的数都会满足这个 case 的条件,请看下面的代码:

    switch(ch) {
    case '0'...'9' : c -= '0';
        break;
    case 'a'...'f' : c -= 'a' - 10;
        break;
    case 'A'...'F' : c -= 'A' - 10;
        break;
    }
    

    参考自:《Linux 设备驱动开发》

  • 相关阅读:
    7. 输油管道问题
    6. 循环赛日程表
    4.JSP内置对象
    3.JSP
    2.CSS
    1.HTML
    5. 逆序对数
    [转]Android View.onMeasure方法的理解
    [转]android:clipToPadding和android:clipChildren
    [转]倍数提高工作效率的 Android Studio 奇技
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8672847.html
Copyright © 2011-2022 走看看