今天,我不得不使用basename()
函数,而man 3 basename
(here)给了我一些奇怪的信息:
我想知道#define _GNU_SOURCE
是什么意思:它污染了我使用GNU相关许可证编写的代码吗?还是只是用来告诉编译器类似“嗯,我知道,这组函数不是POSIX,因此不是可移植的,但我还是想使用它”。
如果是这样,为什么不给人们提供不同的标题,而不必定义一些晦涩的宏来获得一个函数实现或另一个实现呢?
有些东西也困扰着我:编译器如何知道与可执行文件链接的函数实现?它也使用这个#define
吗?
有人给我一些指示吗?
最佳答案
定义_GNU_SOURCE
与许可证无关,而与编写(非)便携式代码无关。如果定义_GNU_SOURCE
,将得到:
mount
,ifconfig
等系统实用程序。只要您了解这些事情,定义
_GNU_SOURCE
就不会有问题,但是应该避免定义它,而应尽可能定义_POSIX_C_SOURCE=200809L
或_XOPEN_SOURCE=700
以确保您的程序可移植。特别是,您不应该使用
_GNU_SOURCE
中的东西是上面的#2和#4。