2014-02-14 2 views
0

현재 배열 구조체에 대한 컴파일 타임 검사를 구현하여 다른 사람이 나중에 배열을 변경하면 배열의 모든 요소가 정의되는지 확인하려고합니다. 나는 누군가가 struct-of-struct에 너무 많은 요소를 추가하는 경우를 피하고자한다. 배열의 크기를 명시 적으로 설정하면 가능하다. 이것은 누군가가 배열에 너무 적은 수의 요소를 정의하고 나머지 요소는 단지 0으로 초기화되는 경우를 포함하지 않습니다.정의 된 배열 요소에 대한 사전 처리기 오류 검사

#include <stdio.h> 

typedef struct myStruct { 
    int a; 
    int b; 
} myStruct_t; 

#define ARRAY_SIZE (3) 

myStruct_t sArr[] = { 
    {0, 0}, 
    {1, 1}, 
    {2, 2} 
} 

#define RATIO  (sizeof(sArr)/sizeof(myStruct_t)) 
#if ARRAY_SIZE != RATIO 
#error API issue 
#endif 

int main(void) { 
    printf("Testing\n"); 
    return 0; 
} 

이것은 컴파일시에 sizeof()이 평가되므로 소리 검사와 같은 것처럼 보입니다. 그러나 컴파일러 보고서 : 가능하면

test.c:15:12: error: missing binary operator before token "(" 
test.c:19: error: expected ',' or ';' before 'int' 

방법, 나는 그런 검사를 구현할 수있다?

감사합니다.

+3

당신은'}'폐쇄'sArr' 선언 이후에 세미콜론이 필요합니다. – TypeIA

+0

#define RATIO (sizeof (sArr)/sizeof (myStruct_t))는 확장되었지만 컴파일 타임에 평가되지 않습니다 ... –

답변

2

전처리 단계 이후의 컴파일러 기능을 사용해야합니다.

C11은 _Static_assert 있습니다 깨끗한 해결책이 될 것입니다

_Static_assert(ARRAY_SIZE == RATIO); 

합니다. 당신은 비교가 1이 그냥 아무것도 할 것이다 유효한 typedef 인 평가되면 당신이

typedef char something_useless[ARRAY_SIZE == RATIO]; 

같은 트릭을 사용할 수없는 경우. 0이고 오류 (제약 조건 위반)가 발생합니다.

1

전처리 기는 sizeof()를 평가하지 않습니다. 이것은 컴파일러가 수행하는 것입니다.

C 프로그램을 컴파일하는 데는 두 가지 주요 단계가 있는데, 텍스트 변환 만하는 전 처리기 단계와 전처리 기의 출력을 컴파일하는 두 번째 주요 상태입니다.

이것은 C 변수와 구조체가 전 처리기에 의해 평가되지 않으므로 의사 결정이 작동하지 않는다는 것을 의미합니다.

ASSERT() 매크로를 사용하여 특정 조건을 설정하는 것이 좋습니다. ASSERT() 매크로를 확장하기 위해 ASSERT()가 활성화 된 경우 런타임에 평가됩니다.

실제로 구조체의 크기에 대한 런타임 검사를 수행하기 위해 특정 함수에 특정 어설 션을 넣기 위해 자체 버전을 작성했습니다. 내 자신의 어설 션 매크로를 사용하여 선택적으로 켜고 끌 수 있습니다.

매크로를 사용하면 어설 션 로그를 생성하는 함수가 있으며 디자이너가 테스트 할 때 사용되는 것과 같은 디버그 빌드가있는 경우 함수에서 휴식을 수행하므로 디자이너가 즉시 실패를 선언하고 스택 추적을 수행하고 다른 단계를 수행하여 어설 션이 발생한 이유를 확인할 수 있습니다.

내가 사용하는 자신의 어설 션 매크로는 기본 롤 : PifLogAbort() 로그 파일을 생성하는 기능입니다

#define NHPOS_ASSERT(x) if (!(x)) { PifLogAbort((UCHAR *) #x , (UCHAR *) __FILE__ , (UCHAR *) "function" , __LINE__);} 

. 이것을 사용하여 파일 이름과 행 번호와 함께 주장 된 조건을 볼 수 있습니다.

관련 문제