GNU C学习笔记

本文深入探讨了GCC中的零长度及变量长度数组应用技巧,展示了如何利用宏定义简化代码,介绍了获取当前函数名的方法,并讲解了特殊属性声明的作用,如aligned和packed属性的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.零长度和变量长度数组

GNU C允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用。零长度数组可以实现数组扩展,结构体中必须包含长度信息,此结构体只能通过堆方式分配内存

(转)例程

#include <stdlib.h>
#include <stdio.h>
struct device{
    int num;
    int count;
    int reserve[0];   //reserve是一个数组名;该数组没有元素;该数组的其实地址紧随结构题device之后;这种声明方法可以巧妙的实现C语言里的数组扩展
};

int main()
{
    struct device * p_dev =
        (struct device *) malloc (sizeof(struct device) + sizeof(int)*25);
    //sizeof(int)*25是数组reserve的具体空间(25个元素)
    p_dev->reserve[0] = 100;
    p_dev->reserve[24] = 0;
    printf("p_dev->reserve[24] = %d\n", p_dev->reserve[24]);
    printf("sizeof(struct device) = %d\n",sizeof(struct device));

// 将结构体device之后的第一个内容(int值,其实就是reserve[0]的值)赋值给变量a
    int a = *(&p_dev->count + 1);
    printf("a = %d\n", a);
}

# ./a.out
p_dev->reserve[0] = 100
p_dev->reserve[24] = 0
sizeof(struct device) = 8
a = 100

GNU C中可以使用变量定义数组

例程

int main(int argc, char *argv[])

{

  int i, n = argc;

  double x[n];

  for(i=0; i < n; i++)

       double[i] = i;

return 0; 

}

2.宏定义

第一种方法

#define mint(type, x, y)  \

  ({type _x = (x); type _y = (y); _x < _y ? _x: _y;})

mint(int, x, y)

mint(float, x, y)

第二种方法

#define min(x, y) ( { \

const typeof(x) _x = (x);  \

const typeof(y) _y = (y);  \

(void) (&_x == &_y);  \   //检查_x,_y类型是否一致

_x < _y? _x: _y; })

3.当前函数名

GNU C预定义了两个标志保存当前函数的名称

_ _FUNC_ _/_ _func_ _

_ _PRETTY_FUNCTION_ _保存带语言特色的名字

4.特殊属性声明

要指定一个声明的属性,只需要在声明后加_ _attribute_ _((ATTRIBUTE)),其中ATTRIBUTE为属性说明,如果存在过个属性可以用逗号分隔,GNU C 支持noreturn,format,section,aligned,packed等十几个属性

unused属性作用于函数和变量,表示该函数或变量可能不会被用到,这个属性可以避免编译器产生警告信息

aligned属性用于变量,结构体或联合体,指定对界方式,以字节为单位

例如 struct example{

            char a;

            int b;

           long c;

}_ _attribute_ _((aligned(4)));表示该结构体的变量以4字节对齐

packed属性作用于变量和类型,用于变量或结构体成员时表示只用最小对界,用于枚举,结构体或联合体类型时表示该类型使用最小的内存

基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值