2016-01-25 13 views
5

C++プロジェクトでサードパーティの静的ライブラリ(.libファイル)を使用しています。静的ライブラリの作者は私のためにクラスにメソッドを追加し、ライブラリの更新されたビルドを私に送った。クラスのメソッド宣言の順序はコンパイラにとって重要ですか?

残念ながら、彼は新しいヘッダーファイルを送信しておらず、彼との通信は遅いため、すぐに新しいヘッダーを取得できないことがあります。私は新しいメソッドのメソッドのシグネチャを知っているので、ヘッダファイルに追加することができます。

私の質問は、パブリックメソッドのリストのどこに新しい宣言(上、下、中...)を追加するかが問題なのかどうかです。私の推測では、であり、ヘッダーファイルの順序によってコンパイルされたクラスの順序が決まるということです。誰かがこれを確認したり反論することはできますか?

+4

可能な重複:http://stackoverflow.com/questions/19858914/does-the-function-declaration-order-matter-in-a-header-file – user2079303

+1

[this stackoverflow](http ://stackoverflow.com/questions/19858914/does-the-function-declaration-order-matter-in-a-header-file)、詳細をすべて説明しています。 – Derlin

+0

お互いに感謝します。リンク先の質問は私の理解に役立ちます。 – adv12

答えて

11

私の質問は、それはどこ私は新しい宣言私の知る限り

を追加するパブリックメソッドのリストには、メンバ関数は通常の関数であれば、それは問題ではありませんが、それがAであれば、それは問題に重要かどうかでありますvirtualメンバー関数。仮想テーブル内の仮想メンバ関数は、特定の順序にあります。ライブラリに.hファイルと異なる順序でライブラリがある場合は、間違った関数を呼び出すことになりがちです。

関連:Force the order of functions in the virtual method table?

+0

うわー、私は '仮想'の問題は考えていませんでしたが、それは非常に現実的なリスクのようです。上にリンクされた重複はそれを通ることを言います、そしてKDEリンクはABIの観点からの分岐に適切な深さに入るようです。 –

+0

情報ありがとうございます。私の場合、関数は仮想ではないので、リストの一番下に新しいメソッド宣言を追加して、あなたが正しいと思います:) – adv12

+0

@ adv12、私は仮想テーブルの順序で長い2000年代の初めに、今までは。メンバ関数が通常のメンバ関数であれば、OKであるはずです。がんばろう。 –

0

メソッド宣言がメソッドが宣言されている戻り型が、それは重要ではない例としては、クラス内で宣言型を使用しない場合。

また、メソッド宣言がクラス内の他の型の宣言に依存する場合、エラーが発生する可能性があります。タイプstruct Bは、構造の宣言自体の前にメンバ関数宣言fに使用されているため

例えば、コンパイラは、このクラス定義

struct A 
{ 
    B f(); 
    struct B {}; 
    //... 
}; 

のエラーを発行します。

+0

情報ありがとうございます。私の場合、関数は 'void something(CString)'(MFC文字列クラス)であり、ヘッダに定義されている型は使用しません。だから私の懸念は、メソッド宣言をクラス定義の "間​​違った"場所に置くと間違ったメソッドが呼び出されるかどうかということでした。しかし、私はリンカーについて忘れてしまった。私はこの種の質問が出てこないC#をよく知っています。 – adv12

+0

@ adv12この場合、関数宣言が他のクラスメンバーの宣言に依存しない場合は問題ありません。 –

0

クラス内のメソッド宣言は、まだ実行されていない変数宣言に依存しない限り、コンパイラにとって重要ではありません。

関連する問題