2016-11-09 6 views
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回宣言する理由は何ですか?

+0

ええええええええええええええええええええええええええええええええええええええええええええと、機能は外部リンクですので、デフォルトでです。 –

+2

[C対C++のExtern関数]の可能な複製(http://stackoverflow.com/questions/11712707/extern-functions-in-c-vs-c) – Baldrick

+1

一般に、そのようなコードは危険です。つまり、2つのセクションのどこかには、「図書館の内部」と「図書館の外部」の機能の間には、おそらく重要な違いが存在する(externの有無のみではない)ことを意味します。これは問題です。なぜなら、 'inside'コードで 'outside'コードと同じ定義を使用すると、2つのコードが同期していることが保証されるからです。違いがあると、コンパイラが診断しないという問題があります。宣言はプロトタイプではないことに注意してください。それは単に指定されていない引数リストを持つ関数ですが、省略記号はありません。 –

答えて

4

これは、互換性のないコンパイラまたは古代のコンパイラの互換性の問題です。 externバージョンは必要ありませんが、関数宣言はデフォルトではexternであるため、これを使用することもできます。

言い換えれば、それはうんざりですが、誰かがそれを必要とするかもしれません。私たちは確かに分かりません。

関連する問題