2015-02-17 6 views
2

Я делаю тип структуры в заголовочном файле data.hИспользование Структуры, определенные в заголовке файлы C

struct student{ 
    float tutFee; 
}; 
struct employees{ 
    float salary; 
}; 
struct person{ 
    char firstName[10]; 
    char type; //s for student //e for employee 
    union { 
     struct student student; 
     struct employees employ; 
    }/*EDIT ->*/common; 
}; 

тогда, когда я попытка объявить-структуру типа человека в menu.c файле

#include "menu.h" 
    #include "data.h" 

    int initateProgram(){ 
     struct person temp; 
    } 

это дает мне ошибку говоря

menu.c:25:19: error: storage size of ‘temp’ isn’t known

что приводит меня к мысли, что либо menu.c по какой-то причине не имеет доступа к data.ho г я объявляя STRUCT неправильно любое понимание ценится

EDIT

Добавлен имя объединения в приведенном выше коде. Тем не менее дает мне ошибку я компиляции следующим

gcc -o a2 uni_personal.c menu.c

uni_personal.c главный файл, который вызывает функцию initateProgram() в menu.c Попытка объявить структуры в любом месте по-прежнему получает мне ошибку Спасибо за помощь до сих пор

Edit 2

я все еще получаю ошибку, но когда я упрощать программу он уходит так, очевидно, ошибка не имеет никакого отношения к т его конкретный код

+2

Посмотрите на предварительно обработанную форму, например. с помощью 'gcc -C -E menu.c> menu.i', затем загрузите' menu.i' в свой редактор. –

+1

Это компилируется для меня с помощью GCC.Хотя с '-std = c99 -pedantic' он предупреждает, что неназванные объединения нестандартны. –

+1

Хотя неназванные профсоюзы являются законными C11. Пожалуйста, покажите, как вы компилируете и убедитесь, что показанный код воспроизводит проблему. – mafso

ответ

9

Нет ничего плохого в объявлении struct person temp; в вашей программе. Причина того, что «размер хранилища« ... »неизвестен,« ошибки заключаются в том, что компилятор видит только прямое объявление типа, но не фактическое определение. С другой стороны, ваш код абсолютно прав, если предположить, что файл "data.h", включенный в ваш файл menu.c, является файлом, который вы показываете в верхней части сообщения. Вы можете проверить, действительно ли это так, запустив только препроцессорное состояние вашего компилятора и рассмотрев вывод. Это может быть достигнуто путем передачи флага компилятора (-E для gcc).

Перед редактировал вопрос: Вы видите эту проблему, потому что ваше определение union не соответствует стандарту C, что ваш компилятор использует (предварительно C11), потому что union член не имеет имени. До C11 некоторые компиляторы, такие как gcc, поддерживали анонимные объединения как расширение компилятора.

Добавление названия к нему должно решить проблему с C99-совместимых компиляторов:

struct person{ 
    char firstName[10]; 
    char type; //s for student //e for employee 
    union { 
     struct student student; 
     struct employees employ; 
    } common; // <<== Here 
}; 
2

Там нет ничего плохого с кодом вы показали, но вы убедитесь, что вы скомпилировать его правильно. Предполагая, что GCC компилятор, либо включить GCC расширения, или компиляции кода в качестве стандартного C (настоятельно рекомендуется):

gcc -std=c11 -pedantic-errors -Wall -Wextra 

Если вы используете более старую версию стандарта, такие как C90 или C99, проверьте ответ на dasblinkenlight ,

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