今天我不得不使用这个basename()功能,man 3 basename(这里)给了我一些奇怪的信息:
basename()
man 3 basename
笔记 basename() 有两种不同的版本——上面描述的POSIX 版本 和 GNU 版本 #define _GNU_SOURCE #include <string.h>
笔记
basename() 有两种不同的版本——上面描述的POSIX 版本 和 GNU 版本
#define _GNU_SOURCE #include <string.h>
#define _GNU_SOURCE
#include <string.h>
我想知道这#define _GNU_SOURCE意味着什么:它是否 污染 了我使用 GNU 相关许可证编写的代码?或者它只是用来告诉编译器“ 好吧,我知道,这组函数不是 POSIX,因此不可移植,但我还是想使用它 ”。
如果是这样,为什么不给人们不同的标题,而不必定义一些晦涩的宏来获得一个或另一个函数实现?
有些事情也困扰着我:编译器如何知道与可执行文件链接的函数实现?它也使用这个#define吗?
#define
有人有一些指示可以给我吗?
定义_GNU_SOURCE与许可证无关,与编写(非)可移植代码有关。如果你定义_GNU_SOURCE,你会得到:
_GNU_SOURCE
mount
ifconfig
只要你知道这些事情,定义应该不是问题_GNU_SOURCE,但你应该避免定义它,而是定义_POSIX_C_SOURCE=200809L或_XOPEN_SOURCE=700尽可能确保你的程序是可移植的。
_POSIX_C_SOURCE=200809L
_XOPEN_SOURCE=700
特别是,_GNU_SOURCE你不应该 使用 的东西是上面的#2 和#4。