C/C++ - typedef struct와 타입 전방 선언으로 인한 C2371 오류
마이크로소프트의 헤더 파일은, struct 타입 정의에서 태그 명과 타입 명을 달리하는 것을 볼 수 있습니다. (아마도 초창기 C 언어 구문의 제약으로 인한 관례였을 것입니다.)
typedef struct _COMMPROP {
WORD wPacketLength;
WORD wPacketVersion;
...[생략]...
DWORD dwProvSpec2;
WCHAR wcProvChar[1];
} COMMPROP,*LPCOMMPROP;
// 태그명 _COMMPROP
// 타입명 COMMPROP
이게 문제가 되는 경우가 바로 전방 선언입니다. 예를 들어, 다음과 같이 소스 코드를 구성하면,
// -------- "ConsoleApplication1.h"
#pragma once
struct AStruct;
class MyType
{
public:
AStruct* as;
MyType();
};
// -------- "ConsoleApplication1.cpp"
#include "ConsoleApplication1.h"
#include "AStruct.h"
MyType::MyType()
{
as = new AStruct(); // Error C2027 use of undefined type 'AStruct'
}
// -------- "AStruct.h"
typedef struct tagAStruct
{
int a = 0;
} AStruct; // Error C2371 'AStruct': redefinition; different basic types
전방 선언인 "struct AStruct;" 구문과 충돌이 발생하면서 C2027, C2371 컴파일 오류가 발생합니다.
오류 해결을 하려면 2가지 방법이 있습니다. 하나는 태그 명과 타입 명을 동일하게 정의하거나,
typedef struct AStruct
{
int a = 0;
AStruct* pNext = nullptr;
} AStruct;
아니면 typedef을 쓰지 않는 것입니다.
struct AStruct
{
int a = 0;
AStruct* pNext = nullptr;
};
사실 이 문제는 struct뿐만 아니라 class에 대해서도 동일하게 발생합니다. 단지, class의 경우 다음과 같이 정의하는 경우가 극히 드물기 때문에,
typedef class tagMyClass
{
public:
AStruct* as = nullptr;
BStruct* bs = nullptr;
} MyClass;
대개 struct에 대해서만 문제가 발생하는 것처럼 보일 뿐입니다.
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]