0

私の関数testは2つの異なる.cppファイルに追加され、関数は以下に示すようにそれぞれのファイルにプライベートです

test1.cpp

#include <iostream>

using namespace std;

void test()
{
    cout << "test" << endl;
}

test2.cpp

#include <iostream>

using namespace std;

void test()
{
    cout << "test" << endl;
}

main.cpp

#include <iostream>

using namespace std;



int main()
{

    return 0;
}

リンク中にエラーmultiple definition of test()が発生しますが、2 つのファイルに独自のプライベート スコープがあることを考えると、どのようにそれが可能なのでしょうか!? .cpp各-files の対応するヘッダーに関数プロトタイプを含めれば理解できましたが、この例ではそのようなことはありません。

4

4 に答える 4

4

inlineそのためには次のキーワードが必要です。

inline void test()
{
    cout << "test" << endl;
}

これにより、1 つの定義ルールに違反することなく、個別のソース ファイルに複数の定義を含めることができます。ただし、関数にはまだ外部リンケージがあり、それらはすべて同じアドレスに解決されることに注意してください。また:

インライン関数は、odr が使用されるすべての翻訳単位で定義され、すべての場合でまったく同じ定義を持つ必要があります。

異なるアドレスを持つ個別の関数 (内部リンケージ) が必要な場合は、static代わりにキーワードを使用してください。

于 2013-06-28T10:18:10.993 に答える
1

両方のテスト関数は、プログラムの同じグローバル名前空間にあります。エラーを回避するには、次のようにします。1) 一部または両方の関数を名前空間にラップします。

namespace A
{
void test()
{
   ...
}
}

2) static キーワードを使用する 3) そのうちの 1 つの名前を変更するだけです

于 2013-06-28T10:19:03.237 に答える
1

statictest関数を追加します。

#include <iostream>

using namespace std;

static
void test()
{
    cout << "test" << endl;
}
于 2013-06-28T10:20:39.987 に答える