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

时间:2024-10-28 07:47:53

目录

一: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];  // 零长数组
};