C++ Enum의 전방 선언

프로그래밍/C++

C++11 기준으로 현재 enum은 기존의 enum과, C++11에 추가된 enum class의 2가지의 타입이 존재한다.

 

unscoped enum

 

1
2
3
4
5
6
enum A : int
{
    first = 0,
    second,
    third
};
cs


scoped enum

 

1
2
3
4
5
6
enum class B : int
{
    first = 0,
    second,
    third
};
cs

 

이전까지 enum은 전방 선언이 되지 않았지만, C++11부터는 전방 선언이 가능하도록 바뀌었다. 그 이유가, 기존의 enum에 어떤 값이 들어있는지 알 수 없으면 그 크기를 정할 수가 없었기 때문이다.

enum class는 타입을 명시하지 않으면 int 타입으로 선언되기 때문에 크기가 명확해짐으로써 전방 선언이 가능하게 되었다.

 

 

따라서, unscoped enum의 경우에는 타입을 선언해야, scoped enum은 타입을 선언하지 않아도 전방 선언이 가능하다.

 

VS2017에서 테스트를 해 보았다.

 

TestEnum.h

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#pragma once
 
enum AEnum
{
    first = 0,
    second,
    third
};
 
enum class BEnum
{
    first = 0,
    second,
    third
};
 
enum AIEnum : int
{
    first_i = 0,
    second_i,
    third_i
};
 
enum class BIEnum : int
{
    first = 0,
    second,
    third
};
 
enum EEnum
{
    first_e,
    second_e,
    third_e
};
cs

 

TestClass.h

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
 
enum AEnum;
enum class BEnum;
enum AIEnum;
enum class BIEnum;
enum EEnum;
 
class TestClass
{
private:
    AEnum a;
    BEnum b;
    AIEnum ai;
    BIEnum bi;
    EEnum ee;
 
public:
    TestClass();
    ~TestClass();
};
cs

 

위와 같은 코드로 빌드를 해보면...

 

 

잘만 된다. VS가 뭔가 이상한것 같아서 g++로 다시 컴파일을 해봤다.

 

 

g++로 컴파일 하면 에러를 뱉어낸다. 즉, 표준 C++11 문법에서는 타입을 선언하지 않은 unscoped enum의 경우에는 전방 선언이 안되는게 맞다.