Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 08.06.2019
Сообщений: 42

Использования одного определения структуры в разных файлах

21.08.2024, 14:53. Показов 16041. Ответов 6

Студворк — интернет-сервис помощи студентам
Есть задача определить структуру в одном файле , а использовать ее (объявлять переменные) в нескольких разных фалах. Однако, столкнулся с трудностью. Компилятор выдает ошибку.

main.c
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include "struct1.h"
#include "struct2.h"
 
 
Str1 my_str;
 
int main (void){
    my_str.a = 10;
    printf("%d\n", my_str.a);
}
struct1.h
C
1
2
3
4
5
6
7
8
#ifndef _STRUC1_H_
#define _STRUC1_H_
 
typedef struct{
    int a;
} Str1;
 
#endif
struct2.h
C
1
2
3
4
5
6
7
8
#ifndef _STRUC2_H_
#define _STRUC2_H_
 
#include "struct1.h"
 
Str1 temp_str;
 
#endif
ошибка такая:
Code
1
In file included from src/struct2.c:1: src/struct2.h:6:1: error: unknown type name 'Str1'
extern пробовал ставить, проблему не решает(

Добавлено через 17 минут
Программа странным образом заработала....Сорри
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.08.2024, 14:53
Ответы с готовыми решениями:

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

Внешние глобальные переменные: определения и объявления в разных файлах
Доброго времени суток, уважаемые участники форума cyberforum.ru. Хотелось бы понять как работает пространство имен, исходя из...

Как изменить значения одного параметра в разных файлах
Задача простенькая, но я далек от программирования и всем что связано с этим. Дело вот в чем, есть у меня папка, в этой папке файлы,...

6
 Аватар для andrey_f
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
21.08.2024, 15:57
В main.c Вы включаете struct1.h и struct2.h, где определена структура Str1.
В struct2.h Вы также включаете struct1.h, чтобы иметь доступ к структуре Str1.
Однако, когда Вы пытаетесь использовать Str1 в struct2.h, компилятор еще не знает о ее определении, поэтому выдает ошибку.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// structs.h
#ifndef _STRUCTS_H_
#define _STRUCTS_H_
 
typedef struct {
    int a;
} Str1;
 
#endif
// struct1.h
#ifndef _STRUCT1_H_
#define _STRUCT1_H_
 
#include "structs.h"
 
#endif
// struct2.h
#ifndef _STRUCT2_H_
#define _STRUCT2_H_
 
#include "structs.h"
 
Str1 temp_str;
 
#endif
// main.c
#include <stdio.h>
#include "struct1.h"
#include "struct2.h"
 
Str1 my_str;
 
int main(void) {
    my_str.a = 10;
    printf("%d\n", my_str.a);
    return 0;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
21.08.2024, 20:59
Цитата Сообщение от andreyfreelans Посмотреть сообщение
Однако, когда Вы пытаетесь использовать Str1 в struct2.h, компилятор еще не знает о ее определении, поэтому выдает ошибку.
??? Ничего подобного там нет. Никаких ошибок в коде ТC нет. ТС что-то навыдумывал. Все прекрасно компилируется.

У ТС ясно видна потенциальная ошибка: определение переменной temp_str в заголовочном файле. Но пока что она не проявилась.
0
0 / 0 / 0
Регистрация: 08.06.2019
Сообщений: 42
22.08.2024, 11:13  [ТС]
Я увидел допущенную мной ошибку уже после публикации сообщения, программа откомпилировалась, вопрос потерял актуальность. Но ни отредактировать, ни удалить тему я не смог. Кроме того, я написал администратору и также попросил тему снести.
В любом случае, всем, кто прокомментировал спасибо!
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
22.08.2024, 17:32
Цитата Сообщение от steklobiz Посмотреть сообщение
Я увидел допущенную мной ошибку уже после публикации сообщения, программа откомпилировалась, вопрос потерял актуальность.
Так о какой "ошибке" идет речь? Зачем здесь эти тайны и интриги? Подарите нам это знание.
0
0 / 0 / 0
Регистрация: 08.06.2019
Сообщений: 42
27.08.2024, 15:08  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так о какой "ошибке" идет речь? Зачем здесь эти тайны и интриги? Подарите нам это знание.
TheCalligrapher , с удовольствием поделюсь с окружающими полученными знаниями. Вот, какие выводы я для себя сделал:
Если определить структуру в одном файле, например так
C
1
2
3
typedef struct {
    int a;
} StructParent;
и потом включить ее в структуру, определенную в другом фале, а именно так
C
1
2
3
4
typedef struct {
    StructParent parent;
    int b;
} StructChild;
, то линковщик будет ругаться. Иными словами, как я понял, бывают глобальные переменные и глобальные функции. Но не бывают глобальных структурных типов. Какой выход я для себя нашел? Я организовал связь через ссылку. Теперь всё работает, ошибок нет. Если конкретно, то в одном файле определяем родительскую структуру.
C
1
2
3
typedef struct {
    int a;
} StructParent;
а во втором фале ссылаемся на нее
C
1
2
3
4
typedef struct {
    StructParent * parent;
    int b;
} StructChild;
Еще раз благодарю всех откликнувшихся.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
27.08.2024, 15:46
Цитата Сообщение от steklobiz Посмотреть сообщение
TheCalligrapher , с удовольствием поделюсь с окружающими полученными знаниями. Вот, какие выводы я для себя сделал:
Если определить структуру в одном файле, например так
Code
1
2
3
typedef struct {
    int a;
} StructParent;
и потом включить ее в структуру, определенную в другом фале, а именно так
Code
1
2
3
4
typedef struct {
    StructParent parent;
    int b;
} StructChild;
, то линковщик будет ругаться.
Это совершенно не верно. Здесь вы привели два typedef-объявления. Typedef-объявления не имеют никакого отношения к линковщику. Линковщик вообще ничего не знает о typedef-объявлениях и ругаться по этому поводу никак не может.

Я не вижу в этом примере вообще никаких предпосылок для ругани от кого-либо (компилятора, линковщика и пр.). Поэтому не ясно, какую проблему вы пытались решить.

Цитата Сообщение от steklobiz Посмотреть сообщение
Иными словами, как я понял, бывают глобальные переменные и глобальные функции. Но не бывают глобальных структурных типов.
По-прежнему не ясно, о чем вы ведете речь. В языке С, чтобы сделать что-то "глобальным", т.е. доступным везде, это что-то нужно предварительно объявить везде, где вы его собираетесь использовать. Это касается и переменных, и функций, и типов. С той только дополнительной оговоркой, что переменные и функции видны линковщику, а типы никакого отношения к линковщику не имеют вообще.

Цитата Сообщение от steklobiz Посмотреть сообщение
Какой выход я для себя нашел? Я организовал связь через ссылку. Теперь всё работает, ошибок нет. Если конкретно, то в одном файле определяем родительскую структуру.
Code
1
2
3
typedef struct {
    int a;
} StructParent;
а во втором фале ссылаемся на нее
Code
1
2
3
4
typedef struct {
    StructParent * parent;
    int b;
} StructChild;
Это прекрасно, но зачем это понадобилось - не ясно. По-прежнему не ясно, какую проблему вы пытались решить. И потому не понятно, о чем здесь идет речь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.08.2024, 15:46
Помогаю со студенческими работами здесь

Использования одного таймера на разных формах
Есть 4 формы( главное меню и 3 уровня игры). При нажатии на кнопку &quot;Начать игру&quot; запускается таймер и начинается 1-ый уровень. Как...

Обновляемая связь между таблицами разных файлов, Сводная таблица на основе трех таблиц в трех разных файлах
Добрый день! Есть три таблицы в трех разных файлах ексель, расположенные в разных компьютерах входящих в одну сеть. Таблицы ежедневно...

Расположение определения функций в заголовочных файлах
grizlik78, Часто вижу что приватную секцию указывают внизу, интересно, зачем? Вроде удобнее расположить приватные члены класса в самом...

Правила объявления и определения структур в файлах
Доброй ночи! Подскажите, пожалуйста: У меня есть заголовочный файл server.h, например, для объявления структуры. Есть файлы server.cpp...

Различаются определения ADC_TypeDef в файлах stm32f10x_cl.h и stm32f10x_map.h
Добрый день! При компиляции проекта STM32 в IDE Keil различаются определения ADC_TypeDef в файлах stm32f10x_cl.h и stm32f10x_map.h. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru