1. ホーム
  2. c

[解決済み] define _GNU_SOURCE "は何を意味しているのですか?

2022-02-03 21:30:35

質問

今日、私は basename() という関数があり man 3 basename ( ここで という変なメッセージが表示されました。

備考

には2種類のバージョンがあります。 basename() - その ポシックス のバージョンと、上記の GNU版 の後に取得します。

#define _GNU_SOURCE
#include <string.h>

これってどうなんだろう #define _GNU_SOURCE は、次のような意味です。 汚し は、私が書くコードにGNU関連のライセンスをつけるのでしょうか? それとも単にコンパイラに"のようなことを伝えるために使われるのでしょうか? まあ、この関数群はPOSIXではないので移植性はないのですが、とにかく使ってみたいのです。 となります。

もしそうなら、ある関数の実装を得るために不明瞭なマクロを定義する代わりに、人々に異なるヘッダを与えてはどうでしょうか?

コンパイラはどのように実行ファイルにリンクする関数の実装を知るのでしょうか?コンパイラはどのように実行ファイルにリンクする関数の実装を知るのでしょうか? #define ということでしょうか?

どなたか、ご指摘のある方はいらっしゃいませんか?

どのように解決するのですか?

定義 _GNU_SOURCE は、ライセンスとは関係なく、すべては(非)ポータブルなコードを書くことに関係します。もしあなたが _GNU_SOURCE となります。

  1. 多くの非標準 GNU/Linux 拡張関数へのアクセス
  2. POSIX 標準から削除された伝統的な関数へのアクセス (多くの場合、より良い代替品に置き換えられたり、特定のレガシー実装に結びついたりといった正当な理由がある)
  3. のようなシステムユーティリティを実装するために必要な、移植不可能な低レベル関数にアクセスすることができます。 mount , ifconfig など。
  4. たくさんのPOSIXで指定された関数の壊れた振る舞い。GNUの人々はその関数がどのように振る舞うべきかについて標準委員会と意見が合わず、彼ら自身のことをすることに決めたのです。

これらのことを意識していれば、「Space」を定義することは問題ないでしょう。 _GNU_SOURCE を定義することは避けるべきですが、その代わりに _POSIX_C_SOURCE=200809L または _XOPEN_SOURCE=700 を使用することで、プログラムの移植性を確保することができます。

特に _GNU_SOURCE ということを 決して は、上記の2番と4番を使用します。