2016-05-30 2 views
-1

Я пытаюсь получить размер структуры, которая была определена в другом исходном файле (other.c), чтобы сохранить его скрытым.получить размер скрытой структуры C

В other.h:

typedef struct X x_t; 

В other.c:

struct X{ 
int y; 
int z; 
}; 

Теперь я хочу в main.c, чтобы получить размер этой структуры.

#include "other.h" 

int main(){ 
    x_t *my_x; 
    my_x = malloc(sizeof(struct x_t)); 
    return 0;} 

Но это дает мне следующую ошибку:

error: invalid application of ‘sizeof’ to incomplete type ‘struct x_t’ 

Может кто-нибудь мне помочь? Спасибо!

+6

Вы не можете сделать это , Если вы хотите, чтобы 'main.c' мог работать в экземплярах' struct X' (а не на указателях), вам нужно будет иметь определение в файле заголовка. –

+0

'sizeof' оценивается во время компиляции. Если 'struct' не отображается, его размер не может быть определен. –

+7

Нет такой вещи, как 'struct x_t', только' x_t' или 'struct X' – user3078414

ответ

3

Вся цель иметь скрытый struct - это тщательно контролировать их строительство, их уничтожение и доступ к содержимому.

Функции для создания, уничтожения, получения содержимого и установки содержимого должны быть предоставлены, чтобы сделать скрытый struct полезным.

Вот пример того, что может быть .h и .c файлы:

other.h:

typedef struct X x_t; 

x_t* construct_x(void); 

void destruct_x(x_t* x); 

void set_y(x_t* x, int y); 

int get_y(x_t* x); 

void set_z(x_t* x, int z); 

int get_z(x_t* x); 

other.c:

struct X { 
    int y; 
    int z; 
}; 


x_t* construct_x(void) 
{ 
    return malloc(sizeof(x_t)); 
} 

void destruct_x(x_t* x) 
{ 
    free(x); 
} 

void set_y(x_t* x, int y) 
{ 
    x->y = y; 
} 

int get_y(x_t* x) 
{ 
    return x->y; 
} 

void set_z(x_t* x, int z) 
{ 
    x->z = z; 
} 


int get_z(x_t* x) 
{ 
    rteurn x->z; 
} 
+1

Решение действительно было набором геттеров и сеттеров! –

Смежные вопросы