9

これは、taucs を使用するコード (私のコードではない) をコンパイルしようとしたときに発生するエラーです。

.../taucs/src/taucs.h:554: error: conflicting declaration ‘typedef struct taucs_ccs_matrix taucs_ccs_matrix’
.../taucs/src/taucs.h:554: error: ‘taucs_ccs_matrix’ has a previous declaration as ‘typedef struct taucs_ccs_matrix taucs_ccs_matrix’

なに?それは自分自身と矛盾していますか?

私は自分自身をつまんだ後、テストヘッダーを作成し、これについて正しいことを確認するためだけに、矛盾する定義を入れました:

ファイル testit.h 内:

#include "somethingelse.h"

typedef struct
{
  int n;
} foobar;

ファイル somethingelse.h 内:

typedef struct
{
  int n;
} foobar;

案の定、私は得る:

testit.h:6: error: conflicting declaration ‘typedef struct foobar foobar’
somethingelse.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’

または、testit.h にこれがある場合:

typedef struct
{
  int n;
} foobar;

typedef struct
{
  int n;
} foobar;

testit.h:9: error: conflicting declaration ‘typedef struct foobar foobar’
testit.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’

行番号は常に異なります。宣言はそれ自体と競合することはありません。理解できません。誰もこれを見たことがありますか?

4

5 に答える 5

16

単一のヘッダーが複数のソース ファイルに含まれていますか? その場合は、次のように「インクルード ガード」でラップする必要があります。

#ifndef TAUCS_H
#define TAUCS_H

//Header stuff here

#endif //TAUCS_H
于 2010-08-24T03:03:51.733 に答える
7

宣言を含むヘッダー ファイル ( .../taucs/src/taucs.h) が (直接的または間接的に) 2 つの別々の#includeディレクティブによって 2 回インクルードされている可能性がありますか?

于 2010-08-24T03:02:16.380 に答える
1

定義を繰り返さないでください。C++ では、定義を 1 回だけ表示できます。できることは、宣言を繰り返すことです。

Atypedefは常に定義です。したがって、私がお勧めする最初のことは、struct適切な名前を付けることです (これは C++ であるため、typedef は何の利点も追加しないため、typedef をドロップするだけです):

// file1.h
struct foobar
{
    int n;
};

次に、それは正確に 1 つのファイルにある必要があります。foob​​ar へのポインターのみを使用するファイルがある場合は、宣言を繰り返すことができます(定義だけではありません)。

// file2.h

// This is just a declaration so this can appear as many times as
// you want
struct foobar;

void doit(const foobar *f); 
于 2010-08-24T05:30:41.990 に答える
1
typedef struct
{
   int n;
} foobar;

typedef struct
{
   int n;
} foobar;

testit.h:9: error: conflicting declaration ‘typedef struct foobar foobar’
testit.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’

この例では、foobar の 2 つの宣言を指定します。コンパイラはどちらを選択すればよいかわからないため、競合する宣言で回避します。同じことを 2 回宣言することはできません。

于 2010-08-24T05:17:29.000 に答える
0

コードをリントするのと同じ問題がありましたが、それは型の二重宣言ではありませんでした。PC-Lint は、C と C++ の混合コードで同じ typedef が使用されていることに不満を持っていました。C ファイルとC++ ファイルで同じ宣言を避けることで、これを修正できました。それが誰かを助けることを願っています。

于 2016-05-17T14:36:39.930 に答える