3

私は多くの異なるファイルを使用するコード ブロックのプロジェクトを持っています - 非常に多くの場合、他のプログラマーによって書かれています。現時点では、同じ方法で名前が付けられた関数を含む 2 つの異なるサブプロジェクトがある状況があります。言いましょう: F(int x)。したがって、F(int x) は 2 つの異なる場所にある 2 つのソース ファイルで定義されており、2 つの異なるヘッダーがあります。また、これらのヘッダー用に 2 つの異なる名前空間を作成しました。

namespace NS1
{
 extern "C"{
  #include "header1definingF.h"
 }
}
namespace NS2
{
 extern "C"{
  #include "header2definingF.h"
 }
}

しかし、コンパイラは、F(int x) の定義が複数あると不平を言っています。Code::Blocks でこれを回避するにはどうすればよいですか (Visual Studio では問題なく動作します)。

編集:より明確にするために、これらのヘッダーにはCコードが含まれています。こんなに混むとは思いませんでした。数千の関数を含む他のプロジェクトを使用する数千のソースファイルがあります...どうすればよいですか。私はそれを機能させる方法がまったくわかりません。

4

6 に答える 6

3

あなたの問題を明確に理解することはできませんが、コンパイラがどのように機能するかを理解する必要があると思います.gccを使用してプログラムを強制する場合、プログラムは最初にインクルード演算子を実行します。つまり、ヘッダーを含めると、コンパイラはコピーしますヘッダファイルをファイルに。ヘッダーを2回含めると、2回の定義エラーが発生します。したがって、1回保証する必要があります。使用できます

#ifndef __FILE_NAME__
#define __FILE_NAME__
// your code
#endif

問題が関数の再定義である場合、コンパイラが関数をどのように区別するかを知っておく必要があります。関数を使用するときに名前空間を使用しないことが問題だと思います。

于 2013-07-22T14:30:02.320 に答える
3

問題は、名前空間が C 関数 (extern "C") に対して機能しないことです。以下は、コンパイルされない単純なサンプルです。

namespace NS1
{
 extern "C"{
  int f()
  {
   return 1;
  }
 }
}
namespace NS2
{
 extern "C"{
  int f()
  {
   return 2;
  }
 }
}

この場合、2 つの関数は異なりますが、名前は同じ f() です。関数を宣言するだけでもコンパイルされますが、同じ関数を参照する必要があります。

この 2 番目のサンプルは正常に動作します。関数には NS1::f() と NS2::f() という名前があり、これらは異なるものです。

namespace NS1
{
 int f()
 {
  return 1;
 }
}
namespace NS2
{
 int f()
 {
  return 2;
 }
}

2 つの異なる C コードを使用したい場合は、NS1_f() および NS2_f() 関数を持つのに役立つ objcopy を使用できます。その後、インクルード内のライブラリのすべての関数の名前を変更する必要があります。この場合、名前空間は使用されません。これは正常です。C には名前空間がありません。同等の関数:

int NS1_f()
{
 return 1;
}
int NS2_f()
{
 return 2;
}
于 2016-02-19T09:44:12.550 に答える
1

2 つのうちの 1 つが必要な場合があります。以下はHeader Guardと呼ばれます。

#ifndef MYHEADER_H
#define MYHEADER_H

//your header code goes here

#endif

このようにして、ヘッダーは、それを要求するオブジェクト ファイルごとに 1 回だけインクルードされます。ただし、同じ識別子を持つ 2 つのメソッドが必要な場合は、それらが異なるNamespacesの一部である必要があります。

namespace myspace1{
    void func(void);
};
namespace myspace2{
    void func(void);
};

それ以外に、他にできることはあまりありません。一般に、同じ名前の関数を 2 つ持つべきではありません。また、言及したヘッダーファイルでこれを変更する必要があります。

関数は何度でも宣言できますが、定義できるのは 1 つだけです。

于 2013-07-22T14:45:01.190 に答える