2017-09-13 6 views
3

私が理解しているように、関数プロトタイプは本来externであり、それらにキーワードを追加しても機能は変更されません。私は、Linuxカーネルのソースコードを見て、次のように出くわした:特定の関数のみでexternを宣言することはありますか?

extern bool console_suspend_enabled; 

/* Suspend and resume console messages over PM events */ 
extern void suspend_console(void); 
extern void resume_console(void); 

int mda_console_init(void); 
void prom_con_init(void); 

void vcs_make_sysfs(int index); 
void vcs_remove_sysfs(int index); 

あなたが見ることができるように、いくつかの機能は、接頭辞externを持っているし、いくつかはしないでください。これはプロジェクト全体のヘッダーファイルのいくつかに存在しているように思えました。これはちょっとした矛盾ですか、何らかの(古い)コンパイラとの互換性の理由ですか?

出典:https://github.com/torvalds/linux/blob/master/include/linux/console.h#L188

+0

コンパイルしようとすると、暗黙の関数などを呼び出すという警告が表示されます... rhe関数を使用してexternをファイルに置き、リンカーがリンクするのを知っているその関数に...なぜヘッダファイルの関数のプロトタイプを作成するのでしょうか...ヘッダーを含めると、リンカーはすべてをリンクする方法を知っています...あなたはqueel_solarのコードで潜伏しましたか? APIを作成するためのexternとtypedefの使用は非常に面白いです。 – morcillo

+0

@morcillo:宣言を前に置かずに名前を使用することはできません。 – Olaf

+0

これは悪いことですが、有効です。 'extern'は宣言に必須ではありませんが、認識されないエラーはありません。いくつかの作者のようなセムはコピー/貼り付けされていて、ちょっとだけ「extern」を追加しないで怠け者でした。 – Olaf

答えて

1

が、これは単なる矛盾であるか、それは(旧)コンパイラの互換性の理由のいくつかの並べ替えのためにあるのですか?

これは確かにコーディングスタイルの不一致です。しかし、両方とも同等であるため、これは無害です。 関数宣言のキーワードexternの有無により違いはありません。関数宣言ではexternはオプションです。関数一つコンパイルで定義されている場合 - このような暗黙的な関数宣言などの微妙なバグをもたらすことができる任意の宣言を提供する一方


ないは( Are prototypes required for all functions in C89, C90 or C99?により、暗黙の宣言はC99ので有効ではありません)ユニットは他のコンパイルユニットで使用されます。ヘッダーファイルを使用して複数のコンパイル単位に宣言を提供するのが一般的です。

関連する問題