0

복잡한 C 구조의 DATABSECONTEXT가 있습니다. 개발자는이 구조에서 다른 필드를 계속 추가합니다. 우리는 검토 한 다음 받아들입니다. 그러나 때로는 동기화가 부족합니다. 복잡한 루틴 function1()이 있습니다. 여기서는 다른 필드에 액세스하여 작업해야합니다. 따라서 구조체에 새로 추가 된 필드가 function1()에서 처리되지 않으면 NULL로 남게됩니다. 일관성이없는 상태이며 나중에 충돌을 일으킬 것입니다.C 구조에서 필드를 추가 할 때 개발자에게 알리고 관련 기능을 살펴보고 검토하는 방법?

다음을 얻고 싶습니다. 이 DATABSECONTEXT 구조체에 일부 필드가 추가 될 때마다 관련 함수 function1()을 다시 방문하기 위해 개발자에게 강제 경고/메시지 메커니즘이 있어야합니다.

나는 우리가 function1()에서 만지는 각 필드에 대한 매크로를 가질 헤더 파일을 유지할 것을 고려했다.() 나는

headerfile1.h 

    #define dbCurrency_funciton1 

field definition macro inside the structure can be modified as: 

headerfile2.h 
    #define funname restruc 
    #define PASTER(x,y) x ## _ ## y 
    #define NAME(fun) PASTER(fun, funname) 

    #define MY_ELEMENT(dtype, mname) dtype mname;\ 
             #ifndef (NAME(mname)) \ 
             #error "please visit funciton1() and add macro @NAME(mname) in headerfile.h" 
             #endif 

    struct DATABSECONTEXT 
    { 
    MY_ELEMENT(char, newlyAddedElement); 
    }; 

하지만 처리기 지시문의 이러한 사용은 MACROS에서 허용되지 않습니다를 할 수있는 기능 1에 사용되는 필드 dbCurrency에 대한 말.

다음 링크 (및 그 이상)를 통과했지만 나에게 맞는 것을 찾지 못했습니다. Link1, Link2

우아한 방법으로이를 달성하는 방법에 대한 제안이 있으십니까?

+0

아래 사람에 의해 설명 어떤 경우의 적용 범위를 보장하지 않습니다. – lilezek

+1

구조체의 크기에 대해 [정적 어설트] (https://stackoverflow.com/questions/3385515/static-assert-in-c)를 사용할 수 있습니다. 예전 컴파일러를 사용하는 경우 네이티브 또는 롤백 할 수 있습니다 . – unwind

+1

매크로를 사용하기보다는 (어색하거나 결정한 개발자가 제대로 사용하지 않을 수도 있음)'function1()'의 소스 코드와 헤더 파일을 입력하고 데이터 구조의 모든 멤버 값을 다음과 같이 설정하는지 확인하십시오. 헤더에 지정됩니다. 설정되지 않은 구성원이 있으면 적절한 메시지를 인쇄하고 오류 조건으로 종료하십시오. 그런 다음 헤더 파일이 변경 될 때마다 해당 프로그램을 실행하도록 빌드 스크립트를 설정하십시오. [필요한 경우 해당 프로그램 검사 전처리 원본]. – Peter

답변

0

런타임에 확인할 수있는 경우 예상되는 크기에 대해 구조체의 크기를 지정할 수 있습니다. 다른 사람이 새 필드를 추가하면 크기가 변경되므로 function1 및 크기를 업데이트해야한다는 오류를 표시 할 수 있습니다.


편집 :이 솔루션 당신은 예상대로 서브 루틴의 일부가 여전히 작동하는지 여부를 검사하는 단위 테스트를 작성할 수

+0

런타임시 필요하지 않습니다. 정적 어서션과 함께'sizeof'를 사용할 수 있습니다. – user694733

+3

새 멤버를 추가하면 데이터 구조의 크기가 변경되는 경우가 있지만 이는 보장되지 않습니다. 안쪽 여백이 작고 (기존 안쪽 여백에 맞을 때) 안쪽 여백과 정렬은 방해가 될 수 있습니다. – Peter

+0

@ 피터 정확히, 구조의 크기는 플랫폼에 따라 다를 수 있습니다. 이것이 코드 유지 관리의 또 다른 포인트입니다. 시스템 종속 계층이 필요합니다. – Yogesh