missing type specifier - [type] assumed. Note: C++ does not support default-[type]
constexpr 예약어가 없던 시절에는, const 예약어로 상수를 지정하는 경우 .h 파일과 .cpp 파일에 각각 다음과 같이 정의를 해야 했었습니다.
// .h
extern const int my_var;
// .cpp
const int my_var = 5;
게다가 const 상수 변수라고 해도 이를 배열의 크기로 지정하려고 하면,
void func()
{
int arr[my_var];
}
다음과 같은 컴파일 오류가 발생합니다.
C4430 missing type specifier - int assumed. Note: C++ does not support default
C2144 syntax error : 'int' should be preceded by ';'
이 때문에 const 상수 변수를 어쩔 수 없이 #define 매크로로 정의를 바꿔야만 했는데요.
이 문제가 constexpr 하나로 모두 해결이 됩니다. 정의는 단순하게 .h 파일에 하나만 유지해주면 되고,
// .h
constexpr int my_var = 5;
컴파일 타임에 평가가 되는 것이므로 배열의 크기 지정으로도 문제 없이 사용할 수 있습니다.
그런데 이상하군요, Visual Studio 2015에 내장된 Visual C++ 컴파일러는 분명히 constexpr을 지원하는데도 여전히 다음과 같은 컴파일 오류만 발생합니다.
C4430 missing type specifier - int assumed. Note: C++ does not support default
C2144 syntax error : 'int' should be preceded by ';'
원인을 찾았는데, ^^; "Platform Toolset"의 지정을 "Visual Studio 2013 - Windows XP (v120_xp)"로 설정한 경우였습니다. 그래서 다음과 같이 "Visual Studio 2015 - Windows XP (v140_xp)"로 지정하니,
정상적으로 컴파일이 되었습니다. ^^ (
CTP 시절의 문제 때문에 v140_xp로 지정하지 않았던 것인데 정식 버전에서는 다행히 문제가 해결되었습니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]