今天,我不得不使用basename()函数,而man 3 basename(here)给了我一些奇怪的信息:



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

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

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

有人给我一些指示吗?

最佳答案

定义_GNU_SOURCE与许可证无关,而与编写(非)便携式代码无关。如果定义_GNU_SOURCE,将得到:

  • 访问许多非标准的GNU / Linux扩展功能
  • 访问POSIX标准中省略的传统功能(通常是有充分的理由,例如被更好的替代品取代,或与特定的传统实现相关联)
  • 访问不能移植的低级功能,但有时需要实现诸如mountifconfig等系统实用程序。
  • 破坏了许多POSIX指定功能的行为,GNU成员就功能应如何行为与标准委员会意见不一致,并决定自行完成工作。

  • 只要您了解这些事情,定义_GNU_SOURCE就不会有问题,但是应该避免定义它,而应尽可能定义_POSIX_C_SOURCE=200809L_XOPEN_SOURCE=700以确保您的程序可移植。

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

    09-04 17:58
    查看更多