3
#ifdefを持つCヘッダファイルの宣言と、変数と関数の前にexternの意味を理解しています。関数がCヘッダファイルで2回宣言されました
/* "lib.h" */
#ifndef LIB_H_
#define LIB_H_
#ifdef LIB_C
void function1();
/* ... */
#else
extern void function1();
/* ... */
#endif
#endif /* LIB_H_ */
、さらに私は、対応するCソースファイル持っている:私はだからここ
/* lib.c */
#define LIB_C
#include "lib.h"
void function1()
{
/* ... */
}
/* ... */
をし、しかし、最近、私は、以下のスキームに組み込みデバイス用のサードパーティのライブラリを持っています少し混乱している。このようにヘッダーにすべての関数を2回宣言する理由は何ですか?
ええええええええええええええええええええええええええええええええええええええええええええと、機能は外部リンクですので、デフォルトでです。 –
[C対C++のExtern関数]の可能な複製(http://stackoverflow.com/questions/11712707/extern-functions-in-c-vs-c) – Baldrick
一般に、そのようなコードは危険です。つまり、2つのセクションのどこかには、「図書館の内部」と「図書館の外部」の機能の間には、おそらく重要な違いが存在する(externの有無のみではない)ことを意味します。これは問題です。なぜなら、 'inside'コードで 'outside'コードと同じ定義を使用すると、2つのコードが同期していることが保証されるからです。違いがあると、コンパイラが診断しないという問題があります。宣言はプロトタイプではないことに注意してください。それは単に指定されていない引数リストを持つ関数ですが、省略記号はありません。 –