2017-12-16 11 views
0

Iは、同じ名前と異なるパラメータを有する2つの関数を定義する2つのヘッダファイルを有しています。私はcが関数のオーバーロードをサポートしていないことを知っていますが、関数宣言にstaticを追加すると、同じ名前の2つの関数を同じソースファイルでしかアクセスできないという警告で宣言できます。とにかくそれは動作していないと私はなぜ分からないのですか?私の理解は間違っていますか?静的および複数の機能の異なるヘッダ内

例:

static bool do_something(char b); 

main.cppには、両方のヘッダが含まれています:

static bool do_something(int a); 

file2.h機能下記た: file1.hは、以下の機能を有する

#include "file1.h" 
#include "file2.h" 

エラーの例:

事前にの
file1.h:26:13: error: conflicting types for ‘do_something’ 
static bool do_something(int a); 

file2.h:23:13: note: previous declaration of ‘do_something’ was here 
static bool do_something(char b); 

感謝。

+1

「静的」なんて違いはありますか?これは矛盾した宣言です。 – coderredoc

+3

ヘッダファイルに 'static'関数を宣言するのはあまり意味がありません。 –

+0

主な理由は、同じ名前が2回現れた場合、実行ファイルを作成するときにCが関数名を使用してリンクを識別するために関数名を使用するためです。リンカーはどちらが良いものか分かりません。私は '静的'がC言語でのmanglingに何らかの影響を与えるとは思わないし、ODR(一つの定義ルール)に従わなければならない。どちらの場合でも、 'main.cpp'ファイルには両方のファイルが含まれているので、あなたの考えはあなたのケースではうまくいかないので、' main.cpp'の視点から見て2つの目に見える相反する定義があります。異なるソースファイルから使用された場合、リンカが1つの関数に不平を言うかどうかはわかりません。 – Phil1970

答えて

1

bool do_something(int a);は、プロトタイプです。コンパイラに関数do_somethingがタイプintのパラメータを要求し、タイプboolの値を返すことをコンパイラに伝えます。この関数を呼び出すと

、コンパイラは正しい引数を渡すことを確認し、正しい型の変数に戻り値を割り当てることができます。

Cは、関数のオーバーロードはありませんので、あなただけのいずれかのコンパイル単位内の関数の一つの定義があり得ることを理解するだろう。コンパイル単位は、すべての.hファイルを含む.cソースファイルです。

したがって、上記の説明は全くリンクに影響を与えません。関数が呼び出されない場合、プロトタイプは必要ありません。プロトタイプが存在する場合、関数が存在する必要はありません。関数が呼び出された場合、関数は実行可能ファイルにリンクされているソースファイルまたはライブラリのいずれかに存在する可能性があります。

関数定義のキーワードstaticは、関数がコンパイル単位内の他の関数にしか表示されないことを示します(コンパイル単位のソースに存在する必要があります)。 .hファイル内のstaticキーワードを含めると、.hファイルが含まれている各ソースファイルにその関数が使用されている場合は、そのソースファイルに存在することを伝えるため意味がありません。

は、関数が使用されている場合、現在のソースファイルに存在していなければならないという意味で、リンクプロセスに影響します。

あなたの場合、2つのプロトタイプのどちらが正しいかを決定し、それに応じて.hファイルを修正するか、別のパラメータを取る別の関数を宣言する必要があります。 do_something_else

関連する問題