1. ホーム
  2. c++

[解決済み] c++の宣言が矛盾している

2022-02-07 20:43:42

質問

以下のようなcppファイルがあります。

#include <iostream> 

#include "i.h"

using namespace std; 

typedef struct abc{
int a1;
int b1;
} abc_t, *abc;

void fun(abc x){
cout<<x->a1;
}

int main(){
abc val;
fun(val);
return 0;
}

i.hファイル.

struct abc;

void fff(struct abc);

コンパイル時に以下のエラーが発生します。

t.cpp:8: error: conflicting declaration ‘typedef struct abc* abc’

t.cpp:5: error: ‘struct abc’ has a previous declaration as ‘struct abc’

t.cpp: In function ‘void fun(abc)’:

t.cpp:11: error: base operand of ‘->’ has non-pointer type ‘abc’

cppファイルをcファイルとして保存し、cコンパイラでコンパイルすると、すべてうまくいきます。 c++コンパイラの問題点は何ですか?

解決方法を教えてください。

C言語では は、これ。

struct abc
{
   int a1;
   int b1;
};

は型を作成します。 struct abc (大雑把に言えば)であり、タイプ abc .

そのため typedef を書かなくても使える型を作るためのトリックです。 struct をあらゆる場所で使用することができます。

typedef struct abc{
   int a1;
   int b1;
} abc_t;

これで、タイプ abc_t と同じである。 struct abc . まだ abc .

というポインタの宣言の上に追加した場合、そのポインタは abc というのは、この名前はまだ使われていないからです。


C++の場合 という名前の型が作成されます。 abc . を使用する必要はありません。 typedef というポインタの宣言が必要です。 abc は無効です。 abc が取られる。


解決方法

以下のように、名前を曖昧にする(そしてコードの難読化を解除する)ことができます。

struct abc
{
   int a1;
   int b1;
};
typedef struct abc abc_t;
abc_t* ptr_to_abc;

あるいは、C++を書いていて、Cとの互換性が必要ない場合は、これだけでいい。

struct abc
{
   int a1;
   int b1;
};

abc* ptr_to_abc;