小编典典

“#define _GNU_SOURCE”是什么意思?

all

今天我不得不使用这个basename()功能,man 3 basename这里)给了我一些奇怪的信息:

笔记

basename() 有两种不同的版本——上面描述的POSIX 版本GNU 版本

#define _GNU_SOURCE
#include <string.h>

我想知道这#define _GNU_SOURCE意味着什么:它是否 污染 了我使用 GNU 相关许可证编写的代码?或者它只是用来告诉编译器“
好吧,我知道,这组函数不是 POSIX,因此不可移植,但我还是想使用它 ”。

如果是这样,为什么不给人们不同的标题,而不必定义一些晦涩的宏来获得一个或另一个函数实现?

有些事情也困扰着我:编译器如何知道与可执行文件链接的函数实现?它也使用这个#define吗?

有人有一些指示可以给我吗?


阅读 140

收藏
2022-08-03

共1个答案

小编典典

定义_GNU_SOURCE与许可证无关,与编写(非)可移植代码有关。如果你定义_GNU_SOURCE,你会得到:

  1. 访问大量非标准 GNU/Linux 扩展功能
  2. 访问 POSIX 标准中省略的传统功能(通常有充分的理由,例如被更好的替代品取代,或者与特定的遗留实现相关联)
  3. 访问不能移植的低级功能,但有时需要实现系统实用程序,如mountifconfig等。
  4. 许多 POSIX 指定函数的破坏行为,在这些函数中,GNU 人员不同意标准委员会关于函数的行为方式并决定做自己的事情。

只要你知道这些事情,定义应该不是问题_GNU_SOURCE,但你应该避免定义它,而是定义_POSIX_C_SOURCE=200809L_XOPEN_SOURCE=700尽可能确保你的程序是可移植的。

特别是,_GNU_SOURCE你不应该 使用 的东西是上面的#2 和#4。

2022-08-03