12

glibc ( GNU Libc ) を調べて、それがどのように書かれているかを理解し始めました。でmalloc.c、次のようなコードを見つけました。

#ifndef void
#define void        void
#endif

誰かが私にこれが何を意味するのか説明してもらえますか? void常に定義されているわけではありませんか?

ありがとう

4

4 に答える 4

10

git historyを見ると、こんな感じでした。

/*
  Void_t* is the pointer type that malloc should say it returns
*/

#ifndef Void_t
#if (__STD_C || defined(WIN32))
#define Void_t      void
#else
#define Void_t      char
#endif
#endif /*Void_t*/

これは、歴史的な [C] の回避策であり、 がなく、代わりにvoid返さmalloc()れました。このコードは 2011 年に Ulrich Drepper によって削除されました。コミットはスクリプトや自動生成されたものではないようです。そのため、彼はそのように定義する意図があったに違いありません。char *void

コミットメッセージは、次のことについて何も述べていませんvoid:

malloc コードを簡素化する

あらゆる種類の未使用の構成オプションとデッド コードを削除します。

于 2012-08-16T03:26:08.887 に答える
7

#define void void理由はわかりませんmalloc.cが、私の推測は次のとおりです。

東海林靖が述べたように、 Cのキーワードであるとは限りませんでした。導入/標準化されたとき、サポートされていないコンパイラでvoid新しいキーワードを使用してコードをコンパイルできるようにするための一般的な回避策は、次のようなマクロとして定義することでした。voidvoid

#define void int   /* or maybe #define void char */

そのマクロ定義は、ヘッダーではなくコンパイラコマンドラインを使用して行われる可能性があるため、すべての変換ユニットにマクロを定義するヘッダーが含まれていることを確認する必要はありません。

ただし、新しいキーワードに移行するプログラマーが次のようなコードのシーケンスを使用することもよくあります。

#ifndef void
#define void int
#endif

たとえば、次のコードが表示されます。

/*
 * This is a fairly bogus thing to do, but there seems to be no better way for
 * compilers that don't understand void pointers.
 */
#ifndef void
#define void char
#endif

http://buildbot.zope.org/Squid-2.4STABLE6%2B/include/snmp_impl.h?annotate=1.1.1.1&cvsroot=Zope.org _

したがって、私の推測では、#define void voidinmalloc.cは、含まれるヘッダーに存在する可能性のあるそのようなシーケンスが再定義されるのを防ぐための方法でありvoid、それでも以前に「gloablly」(malloc.c前にコメントのみがあります#define void void)で定義されていることを許可します。をサポートしていない構成でコンパイルされていた場合void。言い換えると、コンパイルが開始されるvoid前にマクロとしてグローバルに定義されていなかった場合malloc.c、コンパイルの後半で何かを定義する必要がある理由はありませんでした。

于 2012-08-16T06:47:10.570 に答える
4

voidC のキーワードですが、キーワードはプリプロセッサ シンボルとして定義されていません。引用したコードは、それがプリプロセッサ シンボルとしても定義されていることを保証します。

なぜこれが必要なのかわかりません。

于 2012-08-16T03:00:23.303 に答える
0

void常に意味があるかもしれませんが、void通常#defined ではないと思います。そこで何が起こっているのか正確にはわかりませんが、この一連のコードの結果は#ifdef void、後で誰かが言った場合、それが真実になるということです. つまり、このコードの実行によって#defined toが取得されるのは 1 回だけです。void

于 2012-08-16T03:00:36.693 に答える