GNU C与ANSI C

2024-01-29 06:38
文章标签 gnu ansi

本文主要是介绍GNU C与ANSI C,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     Linux上使用的C编译器是GNU C编译器,其对标准的C(ansi c)进行了一定的扩展,这带来的影响是两方面的。一方面增强了其原来的没有的功能,另一方面却对要编写移植性要求较高的程序带来了一些问题。对于后一个问题,在编写程序时,建议是如果在ANSI C中也提供的同样的功能时,尽量使用ANSI C来实现,当然如果不考虑程序的移植性,比如说,我们就是要在一个产品上写一段代码,那就不需要考虑这些了,但是如果要想写一个通用的库,这是应该考虑的。笔者原来很少考虑GNU C与ANSI C之间的区别,最近开了一个文章,感觉这些还是比较重要的,简要把GNU C中一些特别多罗列在下面。其中有几部分我在网上找到的参考文章,非常好,贴出链接。

     1、变量长度数组。

      在标准C中,我们都知道实例化一个数组的时候,其大小必须是常量。GNU C可以使用一个变量的数值来实例化一个数组。例如,下面的程序是正确的。

      int i=10;

      char aa[i];

      2、零长度数组。

      数组长度可以是0吗?很多人一听到认为当然不可以,这完全没有意义嘛。。GNU C中是可以的,但是其并不是表示这个数组的长度为0,这只是一种表现形式,其意义完全不是说这个数组的长度是0长度。例如:

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

这种表现形式一般用在可变长度的BUFF上,你会发现sizeof(struct var_d)==sizeof(int),这就说明了data是不占任何空间的。其实data就是一个常量指针,指向指向用上述结构体实例化对象所占内存空间的下一个地址,其用法一般如下:

     struct var_data *thisline;
     thisline =(struct var_data *)malloc(sizeof(struct var_data)+10);

这篇关于GNU C与ANSI C的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656053

相关文章

G++(GNU C++)安装及使用(windows)

安装步骤: 1、下载 Cygnus 的G++编译器(http://www.claremontmckenna.edu/math/ALee/g++/full.exe),并保存到E盘(或其它任意盘),格式为E:full.exe。 2、直接运行该文件,可能需要十几分钟的时间(中间会有停顿甚至没有任何提示性图片或者符号,需要耐心等待哦)。       或者Win + R ,输入cmd,按Ent

GNU工具集和MinGW

GNU工具集         GNU工具集包含了一系列的基本工具和实用程序,这些工具为系统管理员、开发人员和普通用户提供了丰富的功能和工具支持。         许多开源软件和项目都依赖于GNU工具集提供的稳定和强大的功能,因此GNU工具集的发展与完善对整个开源社区都具有重要意义。通过GNU工具集,用户可以在命令行下完成各种任务,如文件操作、进程管理、编程开发等,为用户提供了强大的工具支持。

GNU的伪操作 (25)

这里主要是 对 GNU的 各个伪操作进行 详细的解释。 先来看着几个 伪操作。 .byte,  .short,  .long,  .quad , .float ,  这个是关于 字节的。 .string   .ascii 是关于字符串的。 这个字符串编译器是可以自动在末尾补0 的。 举例: val:         .word 0x11223344         m

GNU/Linux - Open函数使用的O_CLOEXEC flag

在 Linux 中,“O_CLOEXEC ”标志与 “open ”系统调用一起使用,用于指定在使用 “exec ”系列函数(如 “execve”、“execl ”等)执行新程序时,“open ”返回的文件描述符应自动关闭。 In Linux, the `O_CLOEXEC` flag is used with the `open` system call to specify that

Gnu: binutils: ld: .gnu.warning.链接时的主动警告 glibc

这个是一个gnu的extension,glibc会使用这个功能,标记即将被淘汰的符号,产生链接时的警告,比如: /* When a reference to SYMBOL is encountered, the linker will emit awarning message MSG. *//* We want the .gnu.warning.SYMBOL section to be u

GNU/Linux - 进程关联的控制终端

Controlling terminal 在类 Unix 操作系统中,控制终端是与进程组相关联的终端设备,它控制着进程与终端输入和输出的交互。控制终端通常是启动进程的终端。它负责处理进程的输入(如键盘输入)和输出(如显示文本)。 A controlling terminal is the terminal device associated with a process

GNU/Linux - Linux kernel memory access

User space memory access from the Linux kernel An introduction to Linux memory and user space APIs By M. Jones 10 August 2010 Archive date: 2023-08-31 虽然字节可能是 Linux 中内存的最低可寻址单位,但页面才是内存的可管理抽

GNU 汇编语法基础

目录 一、引言 二、GNU 汇编基本结构 1.指令格式 2.注释 3. 段 三、寄存器和寻址方式 1.寄存器命名 2.寻址方式 四、指令集  1.数据传送指令 2.算术运算指令  3.逻辑运算指令 4.控制流指令  五、宏和函数  1.宏定义   2. 函数定义 六、总结   一、引言         在嵌入式系统开发和底层编程中,汇编语言是

ISO C++ 和 GNU C++ 的区别

C++ 的 ios 标准和 gnu 标准是两种编译器标准或模式,主要由编译器在编译 C++ 代码时所遵循的规范决定。它们之间的区别主要在于是否包含标准之外的扩展以及对特定功能的支持。 1. ISO C++ 标准 (-std=c++11, -std=c++14, -std=c++17, 等) 定义: ISO C++ 标准是由国际标准化组织 (ISO) 制定的 C++ 语言标准。每个标准版本如 C

GNU/Linux - RSYSLOG

Getting started with RSYSLOG in Linux 用于日志处理的 Rocket-fast 系统(rsyslog)是 Linux 中提供的一个系统实用程序,支持消息日志。它具有高性能、出色的安全性和模块化设计。这是一个非常有用的工具,可以接受来自各种来源的输入,并将其转换和存储到多个不同的目的地。 The Rocket-fast System for