私はいくつかのC/C++ソースファイルにcmakeのプロジェクト内のautotoolsのプロジェクトの一部を再利用していると私はのような行が散らばって多くのソースファイルを参照してください。私はgetpid()
がオプションであればこの目的は、構築を理解するであろうHAVE_ *マクロの目的は何ですか?
#ifdef HAVE_UNISTD_H
#include <unistd.h> // for getpid()
#endif
をその呼び出しは同等のHAVE_UNISTD_H
ディレクティブで囲まれていました。ただし、HAVE_UNISTD_H
を指定しないと、ソースファイルはコンパイルされず、getpid()
は定義されていません。これは、unistd.h
が見つかりませんでしたことを私に知らせるコンパイラよりもはるかに秘密だと感じています。
もちろん、これは一例に過ぎません。その他の一般的なマクロには、HAVE_STDINT_H
,HAVE_INTTYPES_H
などがあります。ソースファイルをコンパイルするにはその存在が必須です。
なぜHAVE_*
ガードが含まれていますか?私は、彼らが唯一の欠点を持って感じる:などのソースファイルを再利用
- は、右のヘッダファイルが
HAVE_*
マクロが定義されていと右の存在を確認することが必要です。 - 間違いの場合、開発者は根本的な原因(ヘッダーが見つかりません)を報告するのではなく、付随的なエラー(型/機能が見つかりません)を報告します。
- ソースファイルは少し長めで、読むのが少し面倒です(
#include
と#ifdef
が混在しています)。
これはCですか、C++ですか?ほとんどの現在のコンパイラのCのデフォルトモードは、 'getpid()'が宣言されていないことに関するエラーメッセージを出すものではありません。誰があなたに依頼するかに応じて、どちらがマクロの理由と反対かです。 – hvd
https://stackoverflow.com/questions/1653958も参照してください。 –
@hvd:バージョン5以降のGCCはデフォルトでC11モードに設定されており、暗黙的に宣言されている関数については警告メッセージを生成します。 GCCの古いバージョンだけがC90にデフォルト設定されています。 –