저는 최신 업그레이드 기능을 사용하기 위해 새로운 버전을 찾기 위해 구조체 배열을 숨겨야합니다. 가능한 모든 버전 전환에 대해 변환 함수를 추가하지 않으려합니다. 이게 합리적입니까?
구조체의 변경 가능성이 가장 큰 변경 사항은 미래의 구조에 더 많은 필드를 추가하는 것입니다. 그러면이 경우 새로운 필드의 기본값을 사용할 수 있습니다. 또한 곧 구조체 배열을 구성 파일에 저장하는 작업에 직면하게 될 것이므로 핫 업그레이드 및 구성 저장에 모두 적용 할 수있는 답변에 대한 추가 점수를 얻을 수 있습니다.
난 그냥 그것을 포인터와 크기를 줄 핫 업데이트 메커니즘에 대해 걱정할 필요가 없습니다 그것은 환상적인 마법 :코드의 차후 버전에 C 구조를 보냅니 까?
2
A
답변
10
구조체에 대부분 변화가 더 많은 필드가되기 위해서는입니다 않습니다 미래에 구조체에 추가되고 이것이 발생하면 새로운 필드의 기본값을 사용할 수 있습니다. 버전 1에서
는 항상 각 구조체의 시작 부분에서 필드로 sizeof(myStruct)
있습니다. 그런 다음 새 필드를 추가해야하는 경우 항상 각 구조체의 끝에서 중간 단계가되도록하십시오. 이제 파일을받을 때 (또는 파일에서 읽는 경우) 먼저 크기 필드 만 읽으십시오. 그러면 얼마나 많은 바이트가 그 다음에 오는지 알 수 있습니다. 크기가 수신기/판독기에서 결정한대로 sizeof(myStruct)
보다 작 으면 무언가가 누락되었음을 알고 있으며 기본값이 필요합니다.
7
자동으로 버전 관리를 처리하는 Google의 protocol buffers과 같은 것을 사용하는 것이 좋습니다. 메시지에 새 입력란을 추가하면 처리하기가 매우 쉽습니다.
관련 문제
- 1. 디자이너로 활동을 보냅니 까?
- 2. 어떻게 C#에서 VK_MEDIA_NEXT_TRACK을 보냅니 까?
- 3. 어떻게 System.Linq.Expression을 내 보냅니 까?
- 4. javascript 변수를 레일에 보냅니 까?
- 5. Control.Invoke 펌프 메시지를 보냅니 까?
- 6. TFS에서 변경 집합을 내 보냅니 까?
- 7. 어떻게 Mercurial이 커밋을 다시 보냅니 까?
- 8. C#의 직렬 포트를 통해 Ctrl + C를 보냅니 까?
- 9. C# : Process.Start()로 시작한 콘솔 프로그램에 Ctrl + C를 보냅니 까?
- 10. 임베디드 시스템에서 커널 콘솔을 어디에서 보냅니 까?
- 11. 변수의 내용을 파이썬으로 내 편지함에 보냅니 까?
- 12. SVN : 변경 사항을 어디로 보냅니 까?
- 13. 하나의 MySQL 요청으로 XML을 내 보냅니 까?
- 14. 개체 그래프를 어느 계층에 보냅니 까?
- 15. 사용자가 지정한 날짜에 경고를 보냅니 까?
- 16. .Net SendAsync는 항상 모든 데이터를 보냅니 까?
- 17. 서버간에 클래스 인터페이스뿐만 아니라 클래스를 보냅니 까?
- 18. jQuery/PHP 메일은 쉬운 방법을 보냅니 까?
- 19. SSE에서 최대 속도를 어떻게 내 보냅니 까?
- 20. header()에 POST 매개 변수를 보냅니 까?
- 21. TTouchKeyboard : 같은 프로그램에 키 스트로크를 보냅니 까?
- 22. 동영상을 애니메이션 GIF로 내 보냅니 까?
- 23. PreferenceScreen에서 브로드 캐스트 인 텐트를 보냅니 까?
- 24. JQGrid 구성을 XML로 어떻게 내 보냅니 까?
- 25. DATE_ADD() SQL 함수에 PHP 변수를 보냅니 까?
- 26. 얼랑 : 어떻게 handle_info 메시지를 보냅니 까?
- 27. Android ksoap2 빈 몸체로 봉투를 보냅니 까?
- 28. javax.mail.internet.MimeMessage를 비 ASCII 이름의 수신자에게 보냅니 까?
- 29. .NET에서 DOS 명령 프롬프트에 여러 인수를 어떻게 보냅니 까?
- 30. 데이터베이스 구조를 XML로 복사하는 코드의 속도가 향상되었습니다.
여기에 C (non ++) 포트가 있습니다. http://code.google.com/p/protobuf-c/ –