当前位置: 首页 > ds >正文

Linux系统编程中的_GNU_SOURCE宏

一、宏定义方式

在所有 #include 指令包含头文件之前定义以下宏:

#define _GNU_SOURCE

或在编译时使用

gcc -D_GNU_SOURCE yourfile.c

其核心作用就是 打开所有 GNU C 库(glibc)提供的扩展功能,同时包含 ISO C、POSIX、BSD、SVID、X/Open、LFS 等标准/非标准接口。启用后,你可以在头文件中看到许多平时默认被隐藏的函数原型和宏定义。


  1. 为什么会定义 _GNU_SOURCE

    • 定义 _GNU_SOURCE 后,编译器会解锁所有 GNU C 库(glibc)中非标准的扩展接口,以及一些被 POSIX 标准移除或弃用的传统函数。

    • 这些接口包括:

      1. 大量 GNU/Linux 特有的扩展函数(比如 asprintf(), memmem() 等);
      2. POSIX 标准中“因为历史原因”被删掉的旧函数(比如某些老式字符串处理或文件系统调用);
      3. 非可移植的底层系统接口(如实现 mountifconfig 这类系统工具所需的内部调用)。
      4. (有时)对某些 POSIX 指定函数的“自定义”实现,这些实现并不完全符合标准,而是 GNU 团队根据自己的设计做了变动。
  2. 潜在问题

    • 由于第 2 和第 4 类接口在标准中被弃用或行为不符,你的程序一旦依赖它们,就会失去在非 glibc 环境(比如其他 UNIX 或不同的 libc 实现)下编译和运行的能力。
    • 换言之,使用这些接口会让代码“锁定”在 GNU/Linux + glibc 平台上,降低可移植性。
  3. 推荐做法

    • 不要轻易定义 _GNU_SOURCE;如果只是需要使用 POSIX.1-2008 或 X/Open 7 里定义的接口,应当分别定义:

      #define _POSIX_C_SOURCE 200809L
      // 或
      #define _XOPEN_SOURCE    700
      
    • 这样可以确保你只启用那些有明确定义、在多种平台(Linux、BSD、macOS 等)上都能获得相同行为的标准接口。

  4. 总结

    • 可用:GNU 特有的扩展函数,以及对实现工具有帮助的底层调用。
    • 慎用(或禁用):那些被 POSIX 弃用的传统函数,以及 GNU 自己改写、与 POSIX 标准不一致的函数(上面列出的第 2 和第 4 点)。

参考

StackOverflow 问答

总结

完结撒花!!!

http://www.xdnf.cn/news/13056.html

相关文章:

  • Promise 基础:异步编程的救星
  • 使用idea开发工具创建javaweb项目工程
  • CQF预备知识:Python相关库 -- 傅里叶变换 scipy.fft
  • 第十八章 归档与备份
  • python打卡第48天
  • linux库(AI回答)
  • SpringBoot的5种日志输出规范策略
  • 深入理解 x86 汇编中的符号扩展指令:从 CBW 到 CDQ 的全解析
  • 《光子技术成像技术》第三章 预习2025.6.8
  • 代码审计 BlueCms SQL注入
  • Linux 文件系统底层原理笔记:磁盘结构、ext2 文件系统与软硬链接解析
  • 基于Python学习《Head First设计模式》第九章 迭代器和组合模式
  • Spring Cloud 微服务架构实战指南 -- SpringCLoud概述
  • [深度学习]搭建开发平台及Tensor基础
  • 第23讲、Odoo18 二开常见陷阱
  • SQL导出Excel支持正则脱敏
  • AtCoder AT_abc409_c [ABC409C] Equilateral Triangle
  • Agent短期记忆的几种持久化存储方式
  • 时间序列预测的机器学习方法:从基础到实战
  • HTML前端开发:JavaScript 获取元素方法详解
  • 5. TypeScript 类型缩小
  • 【JVM】Java虚拟机(三)——类加载与类加载器
  • synchronized 关键字​​ 和 ​​Lock 接口(ReentrantLock)​​ 的详细说明及示例,涵盖核心概念、使用场景、代码实现及两者对比
  • 【Elasticsearch】映射:fielddata 详解
  • 【C++特殊工具与技术】优化内存分配(三):operator new函数和opertor delete函数
  • Linux多线程---线程池实现
  • STM32CubeMX-H7-20-ESP8266通信(下)-双单片机各控制一个ESP8266实现通信
  • LLMs 系列科普文(13)
  • 【Java实战】反射操作百倍性能优化
  • MyBatis原理剖析(一)