2014-11-11 5 views
-1

열거 형 길이를 계산하는 방법을 찾으려면 열거 형 끝에 "COUNT"요소를 추가하십시오. 다음과 같이 전처리기를 사용하는 방법을 찾았습니다.전 처리기를 사용하여 enum 크기 가져 오기

#include <iostream> 
#include <boost/preprocessor/tuple/elem.hpp> 

//simple declaration 
template <class E> 
struct enum_size; 

//specialization is done in the macro for each enum created 
#define MAKE_ENUM(name, ...) enum name {__VA_ARGS__}; \ 
    template <>      \ 
    struct enum_size<name> {     \ 
    static const int value = BOOST_PP_VARIADIC_SIZE(__VA_ARGS__); \ 
    }; 

MAKE_ENUM(my_enum1, a, b, c) 
//MAKE_ENUM(my_enum2, a) //triggers compilation error 

int main(int argc, char** argv) { 
    std::cout << enum_size<my_enum1>::value << std::endl; 
} 

그러나 나는 (Cygwin에서의 GCC 4.8.3) 컴파일러에서 재 선언 오류가 위와 같이

main.cpp:16:21: error: redeclaration of 'a' 
MAKE_ENUM(my_enum2, a) 
       ^
main.cpp:9:41: note: in definition of macro 'MAKE_ENUM' 
#define MAKE_ENUM(name, ...) enum name {__VA_ARGS__}; \ 
            ^
main.cpp:15:21: note: previous declaration 'my_enum1 a' 
MAKE_ENUM(my_enum1, a, b, c) 
       ^
main.cpp:9:41: note: in definition of macro 'MAKE_ENUM' 
#define MAKE_ENUM(name, ...) enum name {__VA_ARGS__}; \ 

을 다음과 같이 그때 MAKE_ENUM(my_enum2, e)에 문제가있는 라인을 변경하는 경우 my_enum2을 만들려고 할 때 그것은 깔끔하게 컴파일됩니다. 어떤 아이디어가 여기에 잘못되었으며 어떻게 해결할 수 있습니까? 미리 감사드립니다!

+2

컴파일러가 아닌 GCC 명령 전 처리기 만 실행하고 매크로 확장 후에 생성 된 결과를 조사하여 문제점을 분명히해야합니다. https://gcc.gnu.org/onlinedocs/cpp/Invocation. html http://tigcc.ticalc.org/doc/comopts.html#SEC11 – Mawg

답변

3

변수 a은 이미 my_enum1입니다. 다시 입력 할 수 없습니다.

1) C++ 11을 사용하는 경우 enum 대신 enum class을 사용하십시오.

#define MAKE_ENUM(name, ...) enum class name {__VA_ARGS__}; 

2) 당신은 namespaceenum를 넣을 수 있습니다.

+1

'name ## __VA_ARGS__'은 첫 번째 변수에'name'을 추가하지 않습니까? –

+0

@ForEver : 고마워, 나는 그 시점을 완전히 놓쳤다. 해결책 1) 잘 작동합니다! – linuxfever

+0

음, 네가 맞아. 고마워. 편집 됨. – ForEveR