2009-07-28 8 views
5

문제는 두 개의 다른 열거 형을 가진 두 개의 다른 열거 형을 가진 두 개의 열거 형이 서로 다른 두 개의 프로세스에 의해 생성된다는 것입니다. 다른 파일들과 함께). 열거 형을 동기화하려고합니다. 즉, 열거 형 x에 새 값을 추가하고 다른 열거 형을 업데이트하지 않을 때 컴파일 오류가 발생합니다. 그게 가능하니?C 프로그램 - 컴파일 타임에 두 열거 형이 동기화되어 있는지 확인합니다.

답변

11

왜이 선언을 단일 헤더 파일에 넣은 다음 두 위치에 포함시키는 것이 필요하지 않습니까?

+0

컴파일 할 때 이런 일이 가능한지 알고 싶습니다. –

+0

내가 아는 한 컴파일 할 때 불가능합니다. 당신은 gcc (또는 당신이 무엇을 사용하든)를 호출하기 전에 미리 - 선행 처리기를 작성하여 실행할 수 있습니다. 이 선행 전 처리기는 두 파일 또는 다른 파일 중 하나를 생성합니다. – Gregor

+0

@ 그레고, 음. 컴파일을 시작하기 전에 관련 선언의 여러 복사본을 별도의 단계로 생성 할 수 있습니다. –

5

각 열거 형은 LAST_ENUM_1 및 LAST_ENUM_2와 같이 알려진 enum으로 끝납니다. 비교할 두 헤더 파일에 액세스 할 수있는 파일에서 #if를 사용하십시오. 열거에 사용

#if LAST_ENUM_1 != LAST_ENUM_2 
    #error Enums have different sizes 
#endif 
+0

+1 좋은 생각. '# 에러 '와 같은 것이 있는지 몰랐습니다. – Gregor

+0

#error는 표준의 일부라고 생각합니다. 일반적으로 #warning (또는 유사한)이 있지만 C 표준의 일부가 아닙니다. – Robert

+0

열거 형 상수의 값은 전처리 기에도 사용할 수 있습니까? 나는 그들이 최종 체크가 런타임에 완료되어야 할 것이라고 생각한다. ... – Tobi

0

이름은 모호합니다, 그래서 당신은 문제가 있습니다 : 하나는 컴파일러가 모두 정의에 액세스 할 수 있습니다, 다음 열거 때문에 이름 문제 나 컴파일러의 동일하지 않을 수 있습니다 하나의 정의에 한 번만 액세스 할 수 있습니다.

(Robert가 제안한) 요소 수조차도 컴파일 타임에 확인할 수 없습니다 (전처리 기는 열거 형에 대해 아무것도 모릅니다). 하나의 공통 헤더 파일을 가질 수 없다면, 가장 쉬운 방법은 응용 프로그램을 시작할 때 런타임 체크를하는 것입니다.

0

사용하면 해당 형식처럼 사용하는 경우, 아마도 당신이 처리 할 수있는

enum EMyEnum 
{ 
    JOE = 0, 
    BLACK = 1, 
    WHITE = 2, 

    END_OF_ENUM = 3 
} 

처럼 쉽게 모든

+1

열거를 추가 할 때 변경 사항을 기억해야하기 때문에 '= 3'을 끝에 붙이지 않을 것입니다. – Robert

1

정말 내가 지금 있습니다 sugest 것보다 더 나은 다른 답변처럼 ...

다른 모든 해결책이 효과가 없다면, 같은지 확인하는 간단한 펄 스크립트를 작성하고 makefile에서 perl 스크립트가 호출되는지 확인하십시오. 문제를 해결할 수 있지만 할 수 있으면 피하십시오.

0

컴파일러는 한 번에 하나의 소스 파일 (번역 단위, TU)을보고 있기 때문에 현재 TU와보고 있지 않은 다른 TU 간의 불일치에 대해 불만을 표할 방법이 없습니다. 이 모두 포함 된 헤더에 속한 있도록 - 당신이 두 프로그램에 의해 사용되는 열거의 정의의 사본을 가질 수 있도록

당신은 일을 해결해야합니다. 꽤 많은 것은 다른 사람들에게도 너무 쉽게 오류를 일으키기 쉽습니다.

관련 문제