여러 필드가있는 레코드를 저장하는 C 라이브러리가 있습니다. 스키마는 레코드의 각 필드 유형을 포함하여 텍스트 파일에서 읽습니다. C 런타임 유형 검사
내가 스키마 파일은 데 MyRecord의 각 필드는 int32_t 또는 MYSTRUCT을 유지할지 여부를 말한다typedef enum my_type_enum
{
INT32, //32-bit integer
MYSTRUCT, //some struct I have, details irrelevant
...
} my_type_enum;
typedef struct my_var
{
my_type_enum typetag;
unsigned char* data;
} my_var;
my_var myrecord[numfields];
이 상상, 질문의 목적을 위해 간단합니다. 내 라이브러리는 스키마 파일을 읽고 myrecord의 각 my_var에 대해 태그를 설정하고 데이터에 맞는 양의 공간을 할당합니다.
my_var는 불투명하고 클라이언트 프로그램은 기본적으로 기록에 값을 저장하는 간단한 데이터
void set(my_var* record, size_t field, void * src)
{
memcpy(record[field].data, src, datatypes[record[field].typetag].size);
}
int32_t x = 5;
set(myrecord, 0, &x);
를 들어, 사용하고, 유사한 GET()는 물건을 꺼내.
태그가 지정된 my_var 유형은 데이터가 my_var 내에 있으면 유형 검사를 허용하지만 record가 3 개의 INT32를 보유하고 있다고 말하면 당연히 src가 int32_t를 가리키며 mystruct가 아닌지 확인해야합니다 해당 my_var 데이터를 설정하십시오.
분명히 int32_t * 또는 mystruct *가 void *로 변환되기 전에 검사가 wrapping set()에서 수행되어야합니다. typeof() 속임수로 컴파일 타임 검사를 보았습니다. 내가 원하는 것 같은 기분이 들지는 않지만 모든 트릭을 알지 못한다. ...
클라이언트 프로그램 컴파일시 스키마를 읽는 기능을 제공하고 set_CHECKED () wrapper 매크로 누군가가 int32_t를 my_var로 복사하려고 시도 할 때 컴파일러 오류가 발생합니다. GCC 확장이 좋습니다.
좀 더 명확하게 편집 하겠지만 src 인수는 저장할 일반 데이터 형식에 대한 포인터입니다. 'int32_t x = 5;' 'set (myrecord, 0, &x);) 'src-> typetag'을 사용할 수 없습니다. –