glibc ( GNU Libc ) を調べて、それがどのように書かれているかを理解し始めました。でmalloc.c
、次のようなコードを見つけました。
#ifndef void
#define void void
#endif
誰かが私にこれが何を意味するのか説明してもらえますか? void
常に定義されているわけではありませんか?
ありがとう
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 コードを簡素化する
あらゆる種類の未使用の構成オプションとデッド コードを削除します。
#define void void
理由はわかりませんmalloc.c
が、私の推測は次のとおりです。
東海林靖が述べたように、 Cのキーワードであるとは限りませんでした。導入/標準化されたとき、サポートされていないコンパイラでvoid
新しいキーワードを使用してコードをコンパイルできるようにするための一般的な回避策は、次のようなマクロとして定義することでした。void
void
#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 void
inmalloc.c
は、含まれるヘッダーに存在する可能性のあるそのようなシーケンスが再定義されるのを防ぐための方法でありvoid
、それでも以前に「gloablly」(malloc.c
前にコメントのみがあります#define void void
)で定義されていることを許可します。をサポートしていない構成でコンパイルされていた場合void
。言い換えると、コンパイルが開始されるvoid
前にマクロとしてグローバルに定義されていなかった場合malloc.c
、コンパイルの後半で何かを定義する必要がある理由はありませんでした。
はvoid
C のキーワードですが、キーワードはプリプロセッサ シンボルとして定義されていません。引用したコードは、それがプリプロセッサ シンボルとしても定義されていることを保証します。
なぜこれが必要なのかわかりません。
void
常に意味があるかもしれませんが、voidは通常#define
d ではないと思います。そこで何が起こっているのか正確にはわかりませんが、この一連のコードの結果は#ifdef void
、後で誰かが言った場合、それが真実になるということです. つまり、このコードの実行によって#define
d toが取得されるのは 1 回だけです。void