今天我不得不使用basename()
函数,以及man 3 basename
(这里)给了我一些奇怪的信息:
Notes
有两个不同的版本的基本名称() - 这POSIX 上面描述的版本,以及GNU version,哪个追随
#define _GNU_SOURCE
#include <string.h>
我想知道这是什么#define _GNU_SOURCE
意思是:是闷闷不乐 我使用与GNU相关的许可证编写的代码?还是只是用来告诉编译器之类的东西"好吧,我知道,这组功能不是POSIX,因此无法便携,但我还是想使用它"。
如果是这样,为什么不给别人不同的标题,而不必定义一些晦涩的宏来获得一个函数实现或另一个函数呢?
我也有些困扰:编译器如何知道要与可执行文件链接的功能实现?它使用这个吗#define
也是吗?
有人有一些指针要给我吗?
答案
定义_GNU_SOURCE
与许可证无关,与写入(非)便携式代码有关。如果定义_GNU_SOURCE
, 你会得到:
- 访问许多非标准GNU/Linux扩展功能
- 访问POSIX标准中省略的传统功能(通常是有充分理由的,例如被更好的替代方案取代,或与特定的遗产实施相关联)
- 访问无法便携式的低级功能,但有时需要实施系统实用程序,例如
mount
,,,,ifconfig
, ETC。 - 许多POSIX指定功能的破碎行为,GNU的人们不同意该功能应如何行事并决定做自己的事情的标准委员会。
只要您知道这些事情,定义就不应该是一个问题_GNU_SOURCE
,但是您应该避免定义它,而是定义_POSIX_C_SOURCE=200809L
或者_XOPEN_SOURCE=700
在可能的情况下,以确保您的程序可移植。
特别是_GNU_SOURCE
你应该绝不使用是上面的#2和#4。