2011-03-22 3 views
0

내가 부스트를 사용하여 시리얼 라이브러리를 쓰고 있어요 내가 열거 있습니다PARITY_NONE C++ Windows의 키워드입니까?

enum parity_t { PARITY_NONE, PARITY_ODD, PARITY_EVEN }; 

내가 좋아하는 오류를 얻을 :

오류 1 오류 C2059 : 구문 오류 : '('

문제가 무엇인지 파악할 수 없었습니다. 그런 다음 내 친구와 저는 시도했습니다.

void PARITY_NONE(); 

그리고 우리있어 이러한 오류 :

오류 1 오류 C2143 : 구문 오류 : 실종 ')'

오류이 오류 C2143 '상수'전 : 구문 오류 : 실종 ';' '상수'이전

오류 3 오류 C2182 : 'WORD': 구문 오류 : '무효'

오류 4 오류 C2059 유형의 불법 사용 ')'

내가 부스트 ASIO를 포함하고있다 , 나는 윈도우 직렬 API를 어딘가에 포함하는 것으로 생각한다. 이는 Windows에서만 발생합니다. 해결 방법으로 열거 이름을 변경했습니다. 그러나 나는이 문제와 관련된 것을 인터넷에서 찾을 수 없다. 누군가가이 사실을 알 수있게 도와 줄 수 있습니까?

+0

어떤 컴파일러를 사용하고 있습니까? – Nawaz

+1

Windows는'#define's에 순수한 악마입니다 ... – Xeo

+1

ALL_CAPS가 일반적으로 매크로를 위해 예약 된 이유를 추측 해보십시오! –

답변

5

"정의로 이동"합니다 .h :

// 
// Settable Stop and Parity bits. 
// 

#define STOPBITS_10  ((WORD)0x0001) 
#define STOPBITS_15  ((WORD)0x0002) 
#define STOPBITS_20  ((WORD)0x0004) 
#define PARITY_NONE  ((WORD)0x0100) 
#define PARITY_ODD  ((WORD)0x0200) 
#define PARITY_EVEN  ((WORD)0x0400) 
#define PARITY_MARK  ((WORD)0x0800) 
#define PARITY_SPACE  ((WORD)0x1000) 

#undef 열거를 만들기 전에.

+0

더 빠르다는 젠장, +1! ;) 또는 오히려, 처음에'#include '를 한 후 433 개의 파싱 된 인클루드 파일을 질식시키는 IntelliSense .. – Xeo

+3

매크로가 악의적 인 이유는 다음과 같습니다. [C++ - enum vs . const 대 #define] (http://stackoverflow.com/questions/4767667/c-enum-vs-const-vs-define) – Nawaz

1

enum의 값 중 하나가 이미 다른 값으로 #define 인 경우 가장 많이 발생합니다. 이 값을 확장하면 enum에서 컴파일러 오류가 발생합니다. 당신은 정의가 어디에서 오는 발견 enum

의 모든 값에 대해 다음

#ifdef PARITY_NONE 
#error Duplicate definition 
#endif 

반복에 코드를 변경하여이를 확인할 수있는 것은 조금 까다 롭습니다. 운이 좋다면 다음이 방법

  • 오른쪽 클릭에 열거 정의
  • 유형 PARITY_NONE

    • 코멘트를 해결 선택 그것은 winbase에 정의되어
  • +0

    'grep -d PARITY_NONE * .h'는 조금 더 깨끗합니다. – TonyK

    +0

    @TonyK 나는 동의하지 않는다. 이렇게하면 특정 디렉토리 트리에 정의되어 있는지 여부를 알 수 있습니다. 해당 정의가 실제로 응용 프로그램에 포함되어있는 것은 아닙니다. 헤더 파일이 여러 관련없는 디렉토리에있는 경우 (Windows 프로젝트의 경우처럼) 더 쉽지 않습니다. – JaredPar

    2

    는 그것은 WinBase.h에 정의되어 : 그들은 당신의 열거와 같은 일을하는 것처럼 당신이 배열이나 좋아하는 색인을 위해 그 열거를 사용하지 않는 경우

    // 
    // Settable Stop and Parity bits. 
    // 
    
    #define STOPBITS_10  ((WORD)0x0001) 
    #define STOPBITS_15  ((WORD)0x0002) 
    #define STOPBITS_20  ((WORD)0x0004) 
    #define PARITY_NONE  ((WORD)0x0100) 
    #define PARITY_ODD  ((WORD)0x0200) 
    #define PARITY_EVEN  ((WORD)0x0400) 
    #define PARITY_MARK  ((WORD)0x0800) 
    #define PARITY_SPACE  ((WORD)0x1000) 
    

    는 aswell, 그 값을 사용할 수 있습니다.