GNU C扩展

Linux 内核使用的 GNU C 扩展 ===========================Linux 内核使用的 GNU C 扩展===========================GNC CC 是一个功能非常强大的跨平台 C 编译器,它对 C 语言提供了很多扩展,这些扩展对优化、目标代码布局、更安全的检查等方面提供了很强的支持。本文把支持 GNU 扩展的 C 语言称为 GNU C。Linux 内核代码使用了大量的 GNU C 扩 阅读详情

初始化

int a[100] = { [10] = 1,[20] = 3 };		//指定位置初始化
int b[100] = { [1 ... 10] = 1, [15 ... 20] = 5 };	//指定范围初始化
int index;
switch (index) {
    case 1:
        printf("1\n");
        break;
    case 2 ... 8:		//指定范围
        printf("2-8\n");
        break;
    default:
        printf("other: %d\n",index);
        break;
}
Test t = {		//结构体指定成员初始化
        .age = 10,
        .name = "actarjan"
};

语句表达式

语句表达式的值为最后一个表达式的值

int sum = 0;
    sum = ({
            int s = 0;
            for ( int i = 1; i < 10; i++)
                s += i;
            s;		//sum等于s
    });
    printf("sum = %d\n",sum);	//sum = 45

宏中的语句表达式

#define MAX(x,y) x > y ? x : y				//MAX(1!=1,1!=2);
#define MAX(x,y) (x) > (y) ? (x) : (y)		//3 + MAX(1,2)
#define MAX(x,y) ((x) > (y) ? (x) : (y))	//MAX(i++,j++)
#define MAX(x,y) ({ 	\
	int _x = x;			\
	int _y = y; 		\
	_x > _y ? _x : _y; 	\
})
#define MAX(type,x,y) ({ 	\
	type _x = x;			\
	type _y = y; 			\
	_x > _y ? _x : _y; 		\
})						//调用: MAX(int,3,4)
#define MAX(x,y) ({ 	\
	typeof(x) _x = (x);			\
	typeof(y) _y = (y); 		\
	(void) (&_x == &_y);		\	//不同指针类型的比较会有一个警告,(void)用来消除运算结果没有使用的警告
	_x > _y ? _x : _y; 			\
})

typeof与container_of宏

//typeof用于获取变量类型
int a;
typeof(a) b;		//等价于int b

//container_of可根据成员变量地址获取结构体首地址
#define offsetof(TYPE,MEMBER) ((size_t) &((TYPE*)0)->MEMBER)
#define container_of(ptr,type,member) ({                    \
    const typeof( ((type *)0)->member ) *_mptr = (ptr);      \
    (type*) ( (char*)_mptr - offsetof(type,member) );       \
})

typedef struct {
    int id;
    int age;
} Test;

int main() {
    Test t;
    Test* ptr;
    ptr = container_of(&t.age,Test,age);
    printf("%p\n",&t);
    printf("%p\n",ptr);		//与&t相等
}

零长度数组

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int len;
    char a[0];
} Test;

int main() {
    printf("%lld\n",sizeof(Test));      //4
    Test *t = (Test*)malloc(sizeof(Test) + 20);
    t->len = 20;
    strcpy(t->a,"hello world!\n");
    printf("%s",t->a);	//hello world!
    free(t->a);
    return 0;
}

__attribute__

/*
packed:不按字节对齐(或者说是按1字节对齐),减少内存空洞
aligned(x):按x字节对齐,x必须是2的整数幂,一般不超过16,太大不生效,
section:指定编译时所处的section
*/

typedef struct {
	char a;
	short b;
	int c;
} Data __arrtibute__((packed,aligned(8)));	//成员变量不对齐,整个结构体按8字节对齐
//sizeof(Data) = 8
GNU C的扩展 列举了GNU C中扩张的一些特性 阅读详情

相关推荐

硬件-汽车电子-TBOX/TCAM核心器件选型与系统集成设计指南

本文深入解析汽车电子TBOX/TCAM硬件架构与系统集成设计,涵盖核心器件选型、电源管理、信号完整性优化等关键点。重点分享5G模组选型避坑经验、MCU隐性指标及热设计验证方案,为车载通信系统开发提供实用指南。

weixin_30352645的博客 529

GNU C扩展语法归纳详解_gnu c 扩展

通过 format(printf,1,2) 属性声明,告诉编译器:LOG() 函数的参数,其格式字符串的位置在所有参数列表中的索引是 1,即第一个参数;这个函数定义多了一个参数 num,格式字符串在参数列表中的位置发生了变化(在所有的参数列表中,索引由1变成了2),要检查的第一个变参的位置也发生了变化(索引从原来的2变成了3)。根据结构体的对齐规则,结构体的整体对齐要按结构体所有成员中最大对齐字节数或其整数倍对齐,或者说结构体的整体长度要为其最大成员字节数的整数倍,如果不是整数倍则要补齐。

2401_86436837的博客 1500

中国大学MOOC-翁恺-C语言程序设计习题集-解答汇总

中国大学MOOC-翁恺-C语言程序设计习题集 PAT 习题集 02-0. 整数四则运算(10) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 乔林(清华大学) 本题要求编写程序,计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。 输入格式: 输入在一行中给出2...

weixin_30691871的博客 3万+

GNU C扩展语法

Linux上可用的C编译器是GNU C编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。GNU C对标准C进行一系列扩展,以增强标准C的功能。keil中,已经包含了对GNU C的支持。 1.零长度和变量长度数组 GNU C允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用。例如: struct var_data { int len; char data[0]; } char data[0]仅仅意味着程序中通过var_data结构体实例的data[in

weixin_41579872的博客 951

RK3568(buildroot)利用squashfs+overlay实现嵌入式系统高可靠存储方案

本文详细介绍了在RK3568嵌入式平台上,基于Buildroot系统,利用squashfs只读根文件系统与overlayfs可写层相结合的高可靠存储方案。该方案能有效防止设备意外断电导致的系统文件损坏,通过内核配置、启动脚本编写及镜像制作,实现系统核心的只读保护与用户数据的持久化分离,显著提升嵌入式设备的现场稳定性。

weixin_29189381的博客 546

航空机载总线网络概述

1.机载总线网络概述 现代战斗机的航空电子系统是航空电子技术经历了半个多世纪的漫长演变和不断进步的结果。航空电子系统结构的每次变化,其核心的机载总线网络技术也不断跨上新台阶,而且每次变革都能使飞机性能得到大幅提升。现代飞机的飞行与作战任务包括起飞、巡航、飞行控制、目标搜索、识别跟踪、火控计算、武器投射、制导、电子战、通信等,都需要航空电子系统承担,航空电子系统是现代战斗机的“大脑”和“神经中枢”,机载总线网络则是其关键的“神经网络”。在机载通讯领域发展过程中,具有代表性的典型总线有ARINC429、1553

qq_41854911的博客 1万+

内核中 GNU 的 C 扩展

内核中 GNU 的 C 扩展承接前文(Clang 宏定义初探(二)),提到了一个 GNU 的 C 的扩展用法,最近总结了下主要会用到的有以下一些:结构体( struct )值的初始化这个在对网络包拼装,以及一些配置结构体的赋值有一定的帮助。 例如:typedef struct testnode { int arg1; char arg2; ... }testnode_t;对这个结构体进

superlong100的专栏 576

QGIS三维地形可视化实战:从DEM数据到炫酷3D场景(附Qgis2threejs插件配置)

本文详细介绍了如何利用QGIS和Qgis2threejs插件,将DEM数据转化为交互式三维地形场景的完整工作流。核心内容包括DEM数据准备、坐标系选择(重点对比WGS 84与UTM的差异及影响)、插件核心参数配置、卫星影像与等高线叠加等进阶技巧,并提供了成果导出与常见问题解决方案,帮助用户高效创建可用于网页展示的炫酷3D可视化成果。

mqtt6iot的博客 875

GNU C对ISO标准的扩展——笔记(一)

在朋友的博客上看到这样的C语言初始化方式:int arr[10] = { [5] = 7 }; // a[5] = 7;以前没有用过也不知道有这样的写法。在网上找了一下这方面的资料,最后在http://gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc/C-Extensions.html找到了答案。以下所有内容都来自这个网址。上面的那行C语言初始化语法叫做Designat

jcwKyl的专栏 3714

保姆级教程:在LKD3588开发板上为RK3588添加SC2210摄像头驱动(含完整DTS配置)

本文提供了一份详细的教程,指导如何在LKD3588开发板上为RK3588处理器添加SC2210摄像头驱动,包括完整的DTS配置和内核编译步骤。教程涵盖了环境准备、驱动文件添加、DTS配置详解、内核编译与烧录、驱动测试以及常见问题排查,帮助开发者快速实现SC2210传感器在RK3588平台上的集成与优化。

weixin_42641741的博客 478

CANoe.DiVa的应用——生成测试用例过程流程详解(一)

Diva 生成用例过程

LOVE135149的博客 7925

GNU C 9条扩展语法

GNU C 9条扩展语法 GNC CC是一个功能非常强大的跨平台C编译器,它对标准C语言进行了一系列扩展,以增强标准C的功能,这些扩展对优化、目标代码布局、更安全的检查等方面提供了很强的支持。本文把支持GNU扩展的C语言称为GNU C。 Linux内核代码使用了大量的GNU C扩展,以至于能够编译Linux内核的唯一编译器是GNU CC,以前甚至出现过编译Linux内核要使用特殊的GNU CC

shangzh的专栏 7373

医疗AI多智能体资源调度:用Python构建高性能MCU资源池

本文介绍了医疗AI服务平台中多智能体资源争用问题的解决方案。作者设计了一个基于MCU(多点控制单元)理念的中央资源调度器,通过三层架构(资源抽象层、调度策略层、执行控制层)实现对GPU、API、数据库等医疗资源的统一管理。系统采用增强版信号量机制处理可计数并发资源,优化令牌桶算法管理速率资源,并支持急诊优先、配额限制、审计合规等医疗场景特殊需求。核心代码提供了带优先级抢占的并发控制和医疗专用令牌桶实现,可有效解决多智能体资源争用导致的优先级混乱、资源利用不均等问题。

AllenLV的博客 3209

C扩展:GNU C编译器扩展

结构体的内存分配遵循成员顺序、对齐要求和填充字节的原则。了解这些原理有助于优化内存使用和提高程序性能。可变参数宏提供了一种灵活的方式来处理不确定数量的参数,特别适用于日志记录、调试信息输出等场景。通过使用,可以在宏体中访问和处理这些参数。

2301_76151015的博客 1138

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

你知道GNU C 对C语言的扩展吗?

为了方便使用,GNU C在标准C语言的基础上进行了部分方便开发的扩展。这里讲解一些开发中可能会用到的,或者使用频率比较高的内容。零长度数组和变量长度数组GNU C 允许使用零长度数组,比如...

嵌入式Linux 491

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

嵌入式C语言自我修养:GNU C编译器扩展语法精讲

)(void)是一个类型转换,它将后面的表达式转换为void类型,这意味着表达式的结果被丢弃。而是一个比较两个变量地址是否相同的表达式,这个表达式的结果是一个布尔值,但通过将其转换为void类型,这个结果就被忽略了。void这一行代码的目的是让编译器认为_min1和_min2(或_max1和_max2)这两个变量被使用了,从而避免编译器发出未使用变量的警告。长度为0的数组int a[0];零长度数组有一个特点,就是不占用内存存储空间。

_ 2418

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Go最全GNU C扩展语法归纳详解_gnu c 扩展(2),字节跳动超高难度三面Golang程序员面经

通过 format(printf,1,2) 属性声明,告诉编译器:LOG() 函数的参数,其格式字符串的位置在所有参数列表中的索引是 1,即第一个参数;这个函数定义多了一个参数 num,格式字符串在参数列表中的位置发生了变化(在所有的参数列表中,索引由1变成了2),要检查的第一个变参的位置也发生了变化(索引从原来的2变成了3)。根据结构体的对齐规则,结构体的整体对齐要按结构体所有成员中最大对齐字节数或其整数倍对齐,或者说结构体的整体长度要为其最大成员字节数的整数倍,如果不是整数倍则要补齐。

2401_84904408的博客 1042

keil 下支持C99扩展格式和GNU扩展格式

实现方法: 编译配置管理的c/c++选项卡中Misc control中填写 --c99(或者 --gnu ) 注意:“--c99”或“--gnu”实际上是在ARMCC中加入支持GNU或C99标准的扩展格式

pingxiaozhao的博客 3099

GNU C语法扩展(3)

要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特性对于我们分析内核有着很重要的作用,下面做些总结性的工作。 3 变参宏 标准C的变参宏 在ISO C99里,一个宏可以被声明为带可变的参数个数,就像函数一样。语法如下: #define debug(format, …) fprintf(stde......

Leon的博客 388

2024年最新GNU C扩展语法归纳详解_gnu c 扩展(1),持续更新中

这个函数定义多了一个参数 num,格式字符串在参数列表中的位置发生了变化(在所有的参数列表中,索引由1变成了2),要检查的第一个变参的位置也发生了变化(索引从原来的2变成了3)。这个函数定义多了一个参数 num,格式字符串在参数列表中的位置发生了变化(在所有的参数列表中,索引由1变成了2),要检查的第一个变参的位置也发生了变化(索引从原来的2变成了3)。在上面的程序中,通过语句表达式实现了从1到10的累加求和,因为语句表达式的值等于最后一个表达式的值,所以在for循环的后面,我们要添加一个s;

2401_84925367的博客 637
上一篇: Docker容器使用GPU
下一篇: qemu使用
AcTarjan
博客等级 码龄8年 207粉丝 202原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值