当前位置: 首页 > article >正文

C语言 - GNU C 和 ANSI C 之间的差异

目录

一:C语言版本:

二:ISO C 和 GNU C 与 ANSI C 的关系:

三:GNU C 与 ANSI C的差异:


一:C语言版本:

   C 语言有以下几个标准版本:     

  • C89 / C90

    • C89:由美国国家标准协会(ANSI)于 1989 年制定的标准,通常称为 ANSI C。
    • C90:国际标准化组织(ISO)在 1990 年将 C89 标准采纳为 ISO 9899:1990,称为 C90。
  • C99

    • 于 1999 年发布的标准(ISO 9899:1999),引入了许多新特性,包括:
      • 可变长度数组(VLA)
      • 复合字面量
      • inline 关键字
      • 新的数据类型,如 long longbool 类型
      • 增强的预处理器功能
  • C11

    • 于 2011 年发布的标准(ISO 9899:2011),进一步增强了 C 语言,包括:
      • 多线程支持(_Thread_local 关键字)
      • 原子操作(<stdatomic.h>
      • 断言(static_assert
      • 对 Unicode 支持的增强
  • C18

    • 于 2018 年发布的标准(ISO/IEC 9899:2018),主要是对 C11 的修订,修复了一些错误和不一致之处,没有引入新的特性。
  • C23(预计):

    • 这是正在进行中的标准化工作,旨在引入一些新特性和改进,具体内容尚未最终确定。

二:ISO C 和 GNU C 与 ANSI C 的关系:

        ANSI C:标准化的 C 语言,确保了代码的可移植性和一致性。包括 C89 和 C90 标准。

        ISO C: 这个标准是对 ANSI C 的国际认可,确保了 C 语言在全球范围内的一致性。

        GNU C:基于 ANSI C 的扩展版本,由 GNU 编译器集合(GCC)实现,增加了许多 GNU 特有的功能。

三:GNU C 与 ANSI C的差异:

        1. GNU C 支持嵌套函数

#include <stdio.h>

void outer() {
    void inner() {
        printf("Inner function\n");
    }
    inner();
}

int main() {
    outer();
    return 0;
}

        2. GNU C 支持可变长数组 

#include <stdio.h>

void print_array(int n) {
    int arr[n];  // VLA
    for (int i = 0; i < n; i++) {
        arr[i] = i;
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    print_array(5);
    return 0;
}

        3. GNU C 支持编译属性设置

void my_function() __attribute__((noreturn));

void my_function() {
    // 该函数不会返回
    while (1);
}

        4. GNU C 支持内联汇编

#include <stdio.h>

int main() {
    int result;
    asm ("movl $42, %0" : "=r" (result));  // 内联汇编
    printf("Result: %d\n", result);
    return 0;
}

        5. GNU C 支持零长度数组,多用于表示这是一个动态数组

struct example {
    int size;
    char data[0];  // 零长数组
};


http://www.kler.cn/news/368234.html

相关文章:

  • K8s安装手册
  • Rust教程
  • 【笔记】软件测试09——接口测试
  • 考研要求掌握的C语言程度(堆排序)1
  • react18中的合成事件与浏览器中的原生事件
  • ctfshow(259->261)--反序列化漏洞--原生类与更多魔术方法
  • spring boot 整合Knife4j
  • OpenStack将运行的系统导出 QCOW2 镜像并导入阿里云
  • D - Many Segments 2(AtCoder Beginner Contest 377)
  • 【Flask】二、Flask 路由机制
  • 三种SPI机制的了解及使用
  • linux创建自定义服务部署项目
  • 如何使用Golang的gomail库实现邮件发送功能
  • 将CSDN博客转换为PDF的Python Web应用开发--Flask实战
  • logback日志导入使用
  • 基于docker-compose编排部署微服务快速开发框架
  • GPIO按键驱动分析与使用:input_dev层
  • 简单的udp程序
  • a50股指期货是什么意思?
  • 高效宿舍管理:Spring Boot实现的学生宿舍信息系统
  • 通过热成像技术在地球之外成长,在教室之外学习
  • linux系统安全:开源的反病毒工具ClamAV的安装配置使用和维护介绍
  • 鸿蒙NEXT开发-应用数据持久化之用户首选项(基于最新api12稳定版)
  • 设计模式4-工厂模式策略模式
  • vue3组件通信--自定义事件
  • Spring Boot Configuration和AutoConfiguration加载逻辑和加载顺序调整