目录
一: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 long
和bool
类型 - 增强的预处理器功能
- 于 1999 年发布的标准(ISO 9899:1999),引入了许多新特性,包括:
-
C11:
- 于 2011 年发布的标准(ISO 9899:2011),进一步增强了 C 语言,包括:
- 多线程支持(
_Thread_local
关键字) - 原子操作(
<stdatomic.h>
) - 断言(
static_assert
) - 对 Unicode 支持的增强
- 多线程支持(
- 于 2011 年发布的标准(ISO 9899:2011),进一步增强了 C 语言,包括:
-
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]; // 零长数组
};