Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814

Нюансы терминологии и синтаксиса: объявление и определение

31.01.2016, 17:52. Показов 2729. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех!
Ребята, подскажите, что есть объявление структуры, а что есть определение структуры? Читал сайты, но на одном пишут, что определение, а на втором - объявление.

Например, что есть это:

C++
1
2
3
4
struct example{
    int intNumber;
    float floatNumber;
};
Добавлено через 4 минуты
Да, кстати, читал на сайте microsoft, что любое объявление является определением (кроме ряда случаев, перечисленных там). Судя из этого, выше представлено определение, верно?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.01.2016, 17:52
Ответы с готовыми решениями:

Нюансы синтаксиса
Откуда взялась функция nextOdd()? package main import "fmt" func makeOddGenerator() func() int { var i int = 0 ...

Нюансы синтаксиса: использование using
Всем доброе утро, вообщем хотел спросить давно уже, а что делает using, помимо вот такого его применения using std::cout; //... ...

Нюансы синтаксиса: использование typedef
typedef int(*compare_func)(void* left, void* right); В первых круглых скобках - "*compare_func" новое имя типа, представляющее указатель...

62
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
31.01.2016, 17:55
Цитата Сообщение от Nishen Посмотреть сообщение
Например, что есть это:
Объявление.
Цитата Сообщение от Nishen Посмотреть сообщение
Да, кстати, читал на сайте microsoft, что любое объявление является определением
Скорее всего, имелись в виду встроенные типы.
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
31.01.2016, 17:56  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Скорее всего, имелись в виду встроенные типы.
Да там и о классах речь шла.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
31.01.2016, 17:56
Цитата Сообщение от nd2 Посмотреть сообщение
Объявление.
Это определение!
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
31.01.2016, 17:56
Цитата Сообщение от Nishen Посмотреть сообщение
а что есть определение структуры?
Это когда под объект структуры память выделяется:
C++
1
example obj;
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
31.01.2016, 18:05
Лучший ответ Сообщение было отмечено Новичок как решение

Решение

3.1
2. A declaration is a definition unless it declares a function without specifying the function’s body (8.4), it contains the extern specifier (7.1.1) or a linkage-specification 25 (7.5) and neither an initializer nor a function-body, it declares a static data member in a class definition (9.2, 9.4), it is a class name declaration (9.1), it is an opaque-enum-declaration (7.2), it is a template-parameter (14.1), it is a parameter-declaration (8.3.5) in a function declarator that is not the declarator of a function-definition, or it is a typedef declaration (7.1.3), an alias-declaration (7.1.3), a using-declaration (7.3.3), a static_assert-declaration (Clause 7), an attribute-declaration (Clause 7), an empty-declaration (Clause 7), or a using-directive (7.3.4).
Example: all but one of the following are definitions:
C++
1
2
3
//...
struct S { int a; int b; }; //defines S, S::a, and S::b
//...
Добавлено через 1 минуту
Цитата Сообщение от nd2 Посмотреть сообщение
Это когда под объект структуры память выделяется:
Это определение obj, а example определен уже до этого.

Добавлено через 2 минуты
Думаю, так будет проще:
C++
1
2
struct SomeType; //Объявление
struct SomeType{}; //Определение
3
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
31.01.2016, 18:56  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Думаю, так будет проще:
Да, именно так я и предполагал. Спасибо большое!
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
31.01.2016, 19:00
Nishen, Croessmah показал, как это в стандарте прописано.
Цитата Сообщение от Croessmah Посмотреть сообщение
Думаю, так будет проще:
Assembler
1
2
struct SomeType; //Объявление
struct SomeType{}; //Определение
Но не удивляйся, если в литературе будешь встречать иное.
Миниатюры
Нюансы терминологии и синтаксиса: объявление и определение   Нюансы терминологии и синтаксиса: объявление и определение  
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
31.01.2016, 20:19  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Но не удивляйся, если в литературе будешь встречать иное.
С этого то всё и началось. Я сейчас читаю одну книжку, так там в одном абзаце пишут определение, а в следующем, относительно этого места - пишут объявление. Путаются понятия и становится неясным, что есть что на самом деле.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
31.01.2016, 22:47
Будь моя воля, я бы называл это описанием класса (структуры). Кстати, описание - это один из переводов и для definition, и для declaration.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.01.2016, 23:16
Цитата Сообщение от nd2 Посмотреть сообщение
Будь моя воля, я бы называл это описанием класса (структуры)
это и есть "описание".

определение класса - определение всех его запчастей,
которые были использованы в программе.

проверяется оч просто:
линкер ругнулся? значит класс не до конца определен.
не ругнулся - значит определен.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
31.01.2016, 23:33
Цитата Сообщение от hoggy Посмотреть сообщение
проверяется оч просто:
линкер ругнулся? значит класс не до конца определен.
не ругнулся - значит определен.
Если бы только линкер, тогда всё было бы логично: компилятор контролирует объявления, линкер определения. Ругнулся линкер - нет определения, ругнулся компилятор - нет объявления. Но встретив это:
Цитата Сообщение от Croessmah Посмотреть сообщение
struct SomeType; //Объявление
, и не найдя этого:
Цитата Сообщение от Croessmah Посмотреть сообщение
struct SomeType{}; //Определение
ругается компилятор.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.01.2016, 23:53
Цитата Сообщение от nd2 Посмотреть сообщение
Если бы только линкер, тогда всё было бы логично:
оно итак все логично.
если линкер не ругнулся, значит точно все в порядке.

Цитата Сообщение от nd2 Посмотреть сообщение
struct SomeType; //Объявление
так ведь это не просто объявление.
это - forward declaration

"предварительное объявление".

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

этого достаточно для производства ссылок/указателей.
но это даже не "объявление класса".
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
31.01.2016, 23:59
Цитата Сообщение от nd2 Посмотреть сообщение
ругается компилятор.
Смотря как использовать.

C++
1
2
3
4
5
6
7
struct SomeType; //Объявление SomeType
//...
void bar(SomeType* p) ; //Определение SomeType не требуется
void foo(SomeType* p) //Определение SomeType не требуется
{
   bar(p) ; //Определение SomeType не требуется
}
В другой единице трансляции:
C++
1
2
3
4
5
struct SomeType; //Объявление SomeType
void bar(SomeType* p) //Определение SomeType не требуется
{
   p->x = 10 ; //Требуется определение SomeType 
}
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
01.02.2016, 00:07
Цитата Сообщение от Croessmah Посмотреть сообщение
Смотря как использовать.
Ругается всё равно компилятор, а не линкер.
Цитата Сообщение от Croessmah Посмотреть сообщение
//Требуется определение SomeType
Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
оно итак все логично.
если линкер не ругнулся, значит точно все в порядке.
До линкера там не доходит.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
01.02.2016, 00:10
Цитата Сообщение от nd2 Посмотреть сообщение
Ругается всё равно компилятор
Цитата Сообщение от nd2 Посмотреть сообщение
Но встретив это:
В первой единице трансляции встретил,
Цитата Сообщение от nd2 Посмотреть сообщение
и не найдя этого:
не нашел
Цитата Сообщение от nd2 Посмотреть сообщение
ругается компилятор.
не ругнулся.


Ругается уже в другой единице трансляции.
Компиляция этой прошла успешно.
К ней мы больше не вернемся.

Добавлено через 1 минуту
можете заменить во второй
C++
1
2
3
4
5
struct SomeType; //Объявление SomeType
void bar(SomeType* p) //Определение SomeType не требуется
{
   p = nullptr ; //Не требуется определение SomeType 
}
и линкеру тоже не потребуется
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
01.02.2016, 00:11
Цитата Сообщение от Croessmah Посмотреть сообщение
Ругается уже в другой единице трансляции.
Компиляция этой прошла успешно.
Это понятно всё. Я другое хочу подчеркнуть, что вот этого:
Цитата Сообщение от Croessmah Посмотреть сообщение
struct SomeType{}; //Определение
не хватает (там, естественно, где ругается) именно компилятору.
Цитата Сообщение от nd2 Посмотреть сообщение
Если бы только линкер, тогда всё было бы логично: компилятор контролирует объявления, линкер определения. Ругнулся линкер - нет определения, ругнулся компилятор - нет объявления.
А поэтому:
Цитата Сообщение от nd2 Посмотреть сообщение
Будь моя воля, я бы называл это описанием класса (структуры).
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
01.02.2016, 00:14
Цитата Сообщение от hoggy Посмотреть сообщение
но это даже не "объявление класса".
Это как раз declaration, хоть и forward (п. 3.1/2)
А вот
C++
1
struct X{} ;//Это definition
Можете переводить как угодно, но это не сделает определение объявлением.
Фактически, объявления только и делают,
что вводят имена и их типы (это и делает forward declaration, так же как и с функциями),
чтобы компилятор мог проверить соответствие (например, extern int x).
Но не мне Вам это всё объяснять
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
01.02.2016, 00:14
Под шумок и сам уточню:

объявление - говорит линкеру скоро будет класс жди брат
определение - описание класса (несуществующей сущности), заключается в объявлении класс-членов.
??? - как назвать срр часть класса? (Возможно: определение методов и инициализация класс-членов объявленных в определении класса?)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
01.02.2016, 00:20
Цитата Сообщение от nd2 Посмотреть сообщение
не хватает именно компилятору.
Компилятор ругается, потому как нужно
9.2
1. The member-specification in a class definition declares the full set of members of the class;
Специально раскрасил

Добавлено через 2 минуты
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
объявление - говорит линкеру скоро будет класс жди брат
Объявление класса говорит компилятору, - "Хей, такое имя есть, это класс".
Определение класса говорит компилятору, - "Хей, я определен вот так. Вот такие у меня есть члены".
А линкеру вообще плевать на всё это.
Линкер никогда не ругается по поводу определения класса.
Линкер может ругаться только когда не может связать имя с некой памятью (переменной, функцией)
5
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.02.2016, 00:20
Помогаю со студенческими работами здесь

Нюансы синтаксиса C++ - что обозначает запись *=
Здравствуйте, дорогие форумчане. Это, скорее всего, глупый вопрос, но можете объяснить немного использование таких вот идей: ret *= i ...

Нюансы синтаксиса: функции и квалификатор inline
Значит в принципе если функция не объявлена inline то она должна иметь прототип, иначе нужно объявлять inline... может вопрос...

Нюансы синтаксиса: знак ^ и возведение в степень
при t=9949, k=1 и d=(-1) ro=((t >> k) ^ d) каким-то образом выходит (-4974), а при k=0 - (-9949) как это может быть?

Нюансы синтаксиса: указатель на пользовательский тип
скажите пожалуйста уважаемые форумчане , какая разница будет в этом? #include <iostream> class foo{ public: int a; ...

Нюансы синтаксиса: как напечатать логическое И в C++?
Как напечатать логическое И в с++?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru