문제는 두 개의 다른 열거 형을 가진 두 개의 다른 열거 형을 가진 두 개의 열거 형이 서로 다른 두 개의 프로세스에 의해 생성된다는 것입니다. 다른 파일들과 함께). 열거 형을 동기화하려고합니다. 즉, 열거 형 x에 새 값을 추가하고 다른 열거 형을 업데이트하지 않을 때 컴파일 오류가 발생합니다. 그게 가능하니?C 프로그램 - 컴파일 타임에 두 열거 형이 동기화되어 있는지 확인합니다.
답변
왜이 선언을 단일 헤더 파일에 넣은 다음 두 위치에 포함시키는 것이 필요하지 않습니까?
각 열거 형은 LAST_ENUM_1 및 LAST_ENUM_2와 같이 알려진 enum으로 끝납니다. 비교할 두 헤더 파일에 액세스 할 수있는 파일에서 #if를 사용하십시오. 열거에 사용
#if LAST_ENUM_1 != LAST_ENUM_2
#error Enums have different sizes
#endif
이름은 모호합니다, 그래서 당신은 문제가 있습니다 : 하나는 컴파일러가 모두 정의에 액세스 할 수 있습니다, 다음 열거 때문에 이름 문제 나 컴파일러의 동일하지 않을 수 있습니다 하나의 정의에 한 번만 액세스 할 수 있습니다.
(Robert가 제안한) 요소 수조차도 컴파일 타임에 확인할 수 없습니다 (전처리 기는 열거 형에 대해 아무것도 모릅니다). 하나의 공통 헤더 파일을 가질 수 없다면, 가장 쉬운 방법은 응용 프로그램을 시작할 때 런타임 체크를하는 것입니다.
사용하면 해당 형식처럼 사용하는 경우, 아마도 당신이 처리 할 수있는
enum EMyEnum
{
JOE = 0,
BLACK = 1,
WHITE = 2,
END_OF_ENUM = 3
}
처럼 쉽게 모든
열거를 추가 할 때 변경 사항을 기억해야하기 때문에 '= 3'을 끝에 붙이지 않을 것입니다. – Robert
정말 내가 지금 있습니다 sugest 것보다 더 나은 다른 답변처럼 ...
다른 모든 해결책이 효과가 없다면, 같은지 확인하는 간단한 펄 스크립트를 작성하고 makefile에서 perl 스크립트가 호출되는지 확인하십시오. 문제를 해결할 수 있지만 할 수 있으면 피하십시오.
컴파일러는 한 번에 하나의 소스 파일 (번역 단위, TU)을보고 있기 때문에 현재 TU와보고 있지 않은 다른 TU 간의 불일치에 대해 불만을 표할 방법이 없습니다. 이 모두 포함 된 헤더에 속한 있도록 - 당신이 두 프로그램에 의해 사용되는 열거의 정의의 사본을 가질 수 있도록
당신은 일을 해결해야합니다. 꽤 많은 것은 다른 사람들에게도 너무 쉽게 오류를 일으키기 쉽습니다.
- 1. C 열거 형이 있는지 확인하십시오.
- 2. 내가 정의 된 열거 형이
- 3. 컴파일 타임에 C++ 유형 ID
- 4. 컴파일 타임에 C++ 타입 등록
- 5. 아이폰의 열거 형이 작동하지 않습니다
- 6. 컴파일 타임에 상속을 결정
- 7. Cakephp가 두 개의 값이 배열되어 있는지 확인합니다.
- 8. 컴파일 타임에 함수를 선택하십시오.
- 9. iPhone/Objective-C 배열 열거 형이 충돌 함
- 10. 컴파일 타임에 이벤트 수신?
- 11. 컴파일 타임에 C# 코드를 삽입하는 방법은 무엇입니까?
- 12. 열거 형이 키가되는 사전의 WCF 비 직렬화
- 13. 컴파일 타임에 사용되는 응용 상수
- 14. 컴파일 타임에 enum 값 확인
- 15. 형식 라이브러리에 IDL 열거 형이 표시되지 않습니다.
- 16. 이 열거 형이 컴파일되지 않는 이유는 무엇입니까?
- 17. MySQL 열거 형이 올바르게 사용 되었습니까?
- 18. 열거 형이 너무 비대해질 수있는 지점이 있습니까?
- 19. NSTextView NSTextAttachment가 있는지 확인합니다.
- 20. jre가 설치되어 있는지 확인합니다.
- 21. JPanel에 JButton이 있는지 확인합니다.
- 22. 컴파일 타임에 swf로 데이터를 주입
- 23. ASP.NET에서 연결이 활성화되어 있는지 확인합니다.
- 24. 문자열에 하위 문자열이 있는지 확인합니다.
- 25. 컴파일 타임에 무한 루프가 발생합니까?
- 26. 리눅스에서 C++ 프로그램 컴파일
- 27. Objective-C 프로그램 컴파일
- 28. 열거 형이 없으면 <string, TValue> 사전 대신 컴파일 타임 오류가 발생할 수 있습니다.
- 29. 특정 아키텍처의 C 프로그램 컴파일
- 30. 개체가 StructureMap 컨테이너에 있는지 확인합니다.
컴파일 할 때 이런 일이 가능한지 알고 싶습니다. –
내가 아는 한 컴파일 할 때 불가능합니다. 당신은 gcc (또는 당신이 무엇을 사용하든)를 호출하기 전에 미리 - 선행 처리기를 작성하여 실행할 수 있습니다. 이 선행 전 처리기는 두 파일 또는 다른 파일 중 하나를 생성합니다. – Gregor
@ 그레고, 음. 컴파일을 시작하기 전에 관련 선언의 여러 복사본을 별도의 단계로 생성 할 수 있습니다. –