Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
2 / 2 / 0
Регистрация: 05.02.2021
Сообщений: 162

Что является объявлением структуры, а что является определением?

07.08.2021, 08:50. Показов 2964. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток

C++
1
2
3
4
5
struct Date {
    int day; // День
    std::string month; // Месяц
    int year; // Год
};
Вопрос такой что является объявлением структуры, а что является определением

Или мы определяем структуру объявляя переменную типа Date
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.08.2021, 08:50
Ответы с готовыми решениями:

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

Определить (что является критической секцией, является потоком, является процессом и т.д.
Здравствуйте ребят помогите разобраться с задачкой : В химической лаборатории есть одна защищена комната для опытов, вход в которую...

Установить, что натуральное число N является точным квадратом и не является двузначным
Составить линейную программу, выдающую значение "true", если указанное высказывание является истинным и, соответственно, "false"...

20
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
07.08.2021, 10:04
solvo23,

объявление структуры одновременно с определением структуры:
C++
1
2
3
4
5
struct Date {
    int day; // День
    std::string month; // Месяц
    int year; // Год
};
объявление структуры и отдельно определение структуры:
C++
1
2
3
4
5
6
7
8
9
10
struct Date;//объявление структуры
 
struct Date;//снова объявление структуры
 
//определение структуры
struct Date {
    int day; // День
    std::string month; // Месяц
    int year; // Год
};
Добавлено через 2 минуты
Цитата Сообщение от solvo23 Посмотреть сообщение
Или мы определяем структуру объявляя переменную типа Date
переменную можно объявить после определения структуры. И имя переменной лучше давать не совпадающее с именем структуры

C++
1
Date date1;//объявление переменной
1
 Аватар для vlisp
1063 / 984 / 153
Регистрация: 10.08.2015
Сообщений: 5,360
07.08.2021, 10:25
Цитата Сообщение от solvo23 Посмотреть сообщение
std::string month; // Месяц
глупость
0
2 / 2 / 0
Регистрация: 05.02.2021
Сообщений: 162
07.08.2021, 11:30  [ТС]
Это всего лишь пример структуры что в голову пришло то и написал
0
 Аватар для vlisp
1063 / 984 / 153
Регистрация: 10.08.2015
Сообщений: 5,360
07.08.2021, 11:44
глупость в голову пришла и вообще такие вещи гуглятся довольно просто
0
2 / 2 / 0
Регистрация: 05.02.2021
Сообщений: 162
07.08.2021, 20:53  [ТС]
Цитата Сообщение от vlisp Посмотреть сообщение
глупость в голову пришла и вообще такие вещи гуглятся довольно просто
Ну конечно перед тем как задать вопрос я погуглил
и например получил такой результат
1. Объявление предоставляет основные свойства символа: его тип и его название.
что подтверждает ответ Алексей1153

2. "Объявление структуры" именует тип и задает последовательность переменных значений ("элементы" или "поля" структуры), которые могут иметь разные типы. Необязательный идентификатор — тег — предоставляет имя типа структуры и может использоваться в последующих ссылках на тип структуры.
что противоречит ему же

Я всего лишь хочу четко понимать где объявление, а где определение
поэтому и задаю глупые вопросы
В вопросе главное было не
C++
1
std::string month; // Месяц
, а отделить объявление от определения
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
07.08.2021, 21:02
Цитата Сообщение от solvo23 Посмотреть сообщение
Необязательный идентификатор — тег имя структуры
Цитата Сообщение от solvo23 Посмотреть сообщение
что противоречит ему же

противоречия нет: предварительно объявить, а затем определить, можно только указав одно и то же имя
1
 Аватар для vlisp
1063 / 984 / 153
Регистрация: 10.08.2015
Сообщений: 5,360
09.08.2021, 01:33
Исходя из неоднозначности системы образования, одно и то же в узких околонаучных кругах может называться по разному. Определение и объявление может быть эквивалентным, а может и не быть, как сказано выше.
0
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5
09.08.2021, 11:51

Не по теме:

solvo23, очень интересный вопрос. :D Нашли что спросить. :D

Когда то, очень старался изучить Си, и при чем изучить полностью. Дошел до раздела стандартной библиотеки, затем перешел в раздел C++ и дошел до раздела типов или ООП, точно не помню. И полностью изучение забросил.



Тоже очень старался понять что такое обьявление, и определение.

Например - переменная, это один из обьектов текста программы. Для человека свойственно мыслить обьектами, которые взаимодействуют. Поэтому создатели описания стандарта языка сразу и увидели - вот, переменные это все обьекты. Все очевидно, текст программы наполнен обьектами (переменными).

Далее, обьект должен появлятся в тексте программы. Процесс добавления в программу обьекта можно назвать обьявлением. Есть старое слово которое если не ошибаюсь пишется 'явь', означает то что видно, то есть - действительность (современное слово).

Если обьекта не существовало а он появился - значит произошел процесс обьявления. Тот кто создал процесс появления обьекта выполнил операцию обьявления.

Переменной не было и затем она появилась - переменная обьявлена.

Одна из составляющей обьекта переменной (переменная это сложный многосоставной обьект, например - как любой обьект в природе) это ее размер в памяти.

Для языка Си, процесс задания типа переменной написанием char, int, float, double и добавления по надобности short, long - можно назвать процессом определения размера памяти под переменную. Здесь все от слова 'предел', то есть - граница для задаваемого блока памяти.

Процесс задания границы для какого то значения - ограничение, определение.

Запись начального значения в память переменной можно назвать процессом инициализации. Англ. initial, если не ошибаюсь, означает слово 'начальный', 'заглавный'. Вот и процесс задания начального значения можно назвать - инициализация.

Почти всегда процесс обьявления переменной содержит процесс определения. Если не ошибаюсь, в Си можно обьявить переменную не определяя ее, с помощью void.

Можно переменную сразу обьявить, определить и инициализировать, если воспользоватся оператором '='.

Для структур в Си наверное ситуация в какой то мере аналогичная. Вроде структуры тоже можно назвать обьектами?

Не по теме:

Короче составляли мировые стандарты люди здравые.

0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
09.08.2021, 11:59
Цитата Сообщение от elnorbert Посмотреть сообщение
в Си можно объявить переменную не определяя ее, с помощью void.
это как так? Я всегда считал, что переменную можно только объявить (поскольку тип уже должен быть известен)

Цитата Сообщение от elnorbert Посмотреть сообщение
структуры тоже можно назвать обьектами?
нет, структура - это тип
экземпляр структуры - это объект
0
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5
09.08.2021, 14:33

Не по теме:

Надо сказать что в этой теме слабо разбираюсь, и просьба не матерится если что не так сказал. :D

Если уж что-то точно знаю то всегда об этом говорю, где-то добавляю утверждение, например "Точно известно, что ...". Все остальное, не констатирую.

Надо придумать правильную подпись под сообщениями, чтобы не повторять это постоянно.

Конечно могу ошибаться, все набирают текст и размышляют в разной физической обстановке.

Не все могут позволить себе тратить время на перепроверку каждого утверждения. Если уж точно вспоминаешь что можешь ошибаться, тогда надо проверять в поисковой системе. Или вообще промолчать про сомнительную информацию.



solvo23, не рекомендую вам так точно изучать язык программирования. На такое качество понимания надо затратить много силы и времени.

Возможно лучше изучить тему языка в общем, и на много быстрее получится способность на нем программировать?

Алексей1153, кажется понял вас. Наверное потому что это общепринято в разговоре программистов, так проще.

Никто не будет так заморачиваться в разговоре. Может быть вы правы, не знаю.

Алексей1153, а какую тогда функцию выполнит, например, int? Да еще и если добавить long? Эти команды установят пределы для памяти переменной, выполнят определение.

Все в месте может можно назвать обьявлением переменной? В процессе обьявления есть под-процесс определения.
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
09.08.2021, 14:38
Цитата Сообщение от elnorbert Посмотреть сообщение
а какую тогда функцию выполнит, например, int? Да еще и если добавить long? Эти команды установят пределы для памяти переменной, выполнят определение.
я не понимаю вопрос
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
09.08.2021, 14:41
Вот так (если в новых версиях ничего не поменялось):
C++
1
2
3
4
5
6
7
8
9
struct SomeType ;//Объявление (declaration, forward declaration), не являющееся определением
struct SomeType //Объявление, являющееся определением (definition)
{
   void foo() ;//Declaration
   void bad() {} //Definition   
   static void func() ; //Declaration
   int x; //Definition
   static int s ; //Declaration
};
0
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5
09.08.2021, 21:35
Алексей1153, можно подумать что говорил о функции в языке Си связанные из int? Нет, всмысле эта команда (int, long int) которая записывается перед именем переменной, она задает размер памяти для переменной.

Поэтому в обьявлении переменной всегда будет определение. Потому что в записи обьявления переменной всегда есть char, int, float, double.

Если можно обьявить переменную без задания ее типа - тогда это обьявление без определения. Но ведь это не возможно?

Croessmah, если перед именем переменной записать static, тогда память под переменную не выделяется?

К стати, если трудно понять что такое обьявление и определение, можно разобрать слова declaration и definition. Везде есть приставка 'de', и слова заканчиваются приставкой 'on'.

Не по теме:

Когда переводят текст книги на другой язык, в оригинале слово можно перевести дословно, а можно поменять. Часто человеку проще понять оригинал книги чем ее перевод.

0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
09.08.2021, 21:48
Цитата Сообщение от elnorbert Посмотреть сообщение
Потому что в записи обьявления переменной всегда есть char, int, float, double.
это встроенные типы. У них фиксированные размеры на данном конкретном компиляторе с конкретными настройками битности

Цитата Сообщение от elnorbert Посмотреть сообщение
обьявить переменную без задания ее типа
это невозможно

Цитата Сообщение от elnorbert Посмотреть сообщение
если перед именем переменной записать static, тогда память под переменную не выделяется
выделяется
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
09.08.2021, 22:00
Цитата Сообщение от elnorbert Посмотреть сообщение
Да еще и если добавить long?
long int - это не "long + int" - это совершенно отдельная самостоятельная штука.
Цитата Сообщение от elnorbert Посмотреть сообщение
она задает размер памяти для переменной
Только лишь? И что тогда насчёт float или unsigned int супротив int?
Цитата Сообщение от elnorbert Посмотреть сообщение
если перед именем переменной записать static, тогда память под переменную не выделяется?
Выделяется.
Цитата Сообщение от elnorbert Посмотреть сообщение
К стати, если трудно понять что такое обьявление и определение, можно разобрать слова declaration и definition. Везде есть приставка 'de', и слова заканчиваются приставкой 'on'.


int и struct A{}; - оба два типы. Первый "встроенный", его объявление доступно везде, а определения запрятано глубоко и, соотв-но, применительно к таким типам "объявление/определение типа" встречается редко. Для второго "объявление/определение типа" имеет смысл куда чаще, т.к. это пользовательский тип и его объявляют/определяют повсеместно.

Языковая конструкция вроде "объявим переменную типа Х" ничего общего с "объявим тип Х" не имеет, оно означает "создадим объект типа Х".
Стоит различать.
0
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5
10.08.2021, 02:06

Не по теме:

Лучше промолчу. :D До свидания. :D



Надо помогать топикстартеру, а не оффтопить.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.08.2021, 02:48
в языке с++ возможны ситуации, когда сущность определена, но не объявлена.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12936 / 6803 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
10.08.2021, 03:39
Цитата Сообщение от solvo23 Посмотреть сообщение
Ну конечно перед тем как задать вопрос я погуглил и например получил такой результат
Для какого языка программирования?

В языке С, например, понятие "определения" применимо только к переменным, функциям, typedef-псевдонимам и макросам. В С нет такого понятия как "определение структуры". Структуры в С только объявляются. И вариант struct S; и вариант struct S { ... }; являются объявлениями. Разница лишь в том, что первая объявляет неполный тип, вторая - полный.

В С++ ситуация совсем другая и для класс-типов вводится деление на объявление и определение.

Ваше гугленье нагуглило ответы для С или для С++?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
10.08.2021, 11:32
Цитата Сообщение от elnorbert Посмотреть сообщение
Croessmah, если перед именем переменной записать static, тогда память под переменную не выделяется?
В смысле?

И да, определения не будет.

C++
1
2
3
4
5
6
7
8
9
struct Some {
    static int x;
};
 
void foo(int *) {}
 
int main() {
    foo(&Some::x);
}
https://wandbox.org/permlink/kh8l0wQaCPh0xZHZ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.08.2021, 11:32
Помогаю со студенческими работами здесь

Показать, что пространство всех многочленов P[0,1] является нормированным, но не является банаховым
Здравствуйте! Пытаюсь показать, что пространство P всех многочленов с вещественными коэффициентами на отрезке является нормированным...

Доказать, что данная мера является непрерывной, но не является сигма- аддитивной
Рассмотрим множество X=[0,1) и полукольцо S={[a,b) ∩QX}, на котором задана мера m([a,b) ∩Q)=b-a. Доказать, что данная мера...

Доказать, что предикат является (или не является) (примитивно) рекурсивным
Доказать, что предикат ¬¬B⊃B является (или не является) (примитивно) рекурсивным: «х есть геделев номер частного случая схемы логических...

Доказать, что предикат является (или не является) (примитивно) рекурсивным
Нужна курсовая по теме. Если у кого то есть хоть какая то информация - буду очень признателен. Доказать, что следующий предикат...

Доказать, что первая матрица является или не является элементом (решением) трёх заданных матриц
Добрый день! Мне очень нужна помощь в решении задачи. Условие: Исследуйте \begin{pmatrix}1\\ -5\\...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru