私が理解しているように、関数プロトタイプは本来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
コンパイルしようとすると、暗黙の関数などを呼び出すという警告が表示されます... rhe関数を使用してexternをファイルに置き、リンカーがリンクするのを知っているその関数に...なぜヘッダファイルの関数のプロトタイプを作成するのでしょうか...ヘッダーを含めると、リンカーはすべてをリンクする方法を知っています...あなたはqueel_solarのコードで潜伏しましたか? APIを作成するためのexternとtypedefの使用は非常に面白いです。 – morcillo
@morcillo:宣言を前に置かずに名前を使用することはできません。 – Olaf
これは悪いことですが、有効です。 'extern'は宣言に必須ではありませんが、認識されないエラーはありません。いくつかの作者のようなセムはコピー/貼り付けされていて、ちょっとだけ「extern」を追加しないで怠け者でした。 – Olaf