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

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

31.01.2016, 17:52. Показов 2727. Ответов 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
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
01.02.2016, 20:41
Студворк — интернет-сервис помощи студентам
nd2, просто в код "забилось" значение.
Посмотрите выхлоп на асме.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
01.02.2016, 20:47
Цитата Сообщение от Croessmah Посмотреть сообщение
просто в код "забилось" значение.
Посмотрите выхлоп на асме.
Я этого не понимаю. Что значит "забилось"? А где это?
Цитата Сообщение от Croessmah Посмотреть сообщение
и линкер будет орать, когда ему потребуется определение
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
01.02.2016, 20:55
А где это?
Вот:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 
struct example
{
    static const int intNumber = 1;
};
 
int main() {
   std::cout << &example::intNumber ;
}
http://ideone.com/a7mAeK
Я этого не понимаю.
Тогда какой смысл спорить?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
01.02.2016, 21:09
Цитата Сообщение от Croessmah Посмотреть сообщение
Вот:
Вот.
Цитата Сообщение от Croessmah Посмотреть сообщение
Тогда какой смысл спорить?
Пытаюсь разобраться.
Миниатюры
Нюансы терминологии и синтаксиса: объявление и определение  
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.02.2016, 21:09
Цитата Сообщение от nd2 Посмотреть сообщение
А где это?
Этого нет, потому что cl.exe "дофига умный". Адаптируется под пользователя Если пользователь адрес взял, то компилятор создал инстанс переменной. Если не взял, то вставил единичку по месту использования.
Другие компиляторы более строго трактуют стандарт, поэтом на них будет ошибка.
Для сравнения:
В GCC: http://rextester.com/PAFK64324
В Clang: http://rextester.com/NRK55486
В VС++: http://rextester.com/CXGDF35585
А "забилось" - это значит, что вместо, например, такого:
Assembler
1
mov     ecx, DWORD PTR example::intNumber[rip]
будет сгенерировано такое:
Assembler
1
mov     ecx, 11
2
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
01.02.2016, 21:26
Понятно, опять студия путает.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.02.2016, 21:28
nd2, можно еще Страуструпа почитать на эту тему: http://www.stroustrup.com/bs_faq2.html#in-class
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
01.02.2016, 21:29
Если без взятия адреса, то и другие компиляторы (более строго трактующие стандарт) вставляют единичку по месту назначения?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.02.2016, 21:31
Цитата Сообщение от nd2 Посмотреть сообщение
Если без взятия адреса, то и другие компиляторы (более строго трактующие стандарт) вставляют единичку по месту назначения?
Да. Т.е. так, как будто бы ты пишешь не:
C++
1
printf("%d", example::intNumber);
а сразу
C++
1
printf("%d", 1);
2
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
01.02.2016, 21:37
И тут никакого нарушения стандарта нет?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
01.02.2016, 21:39
nd2, нет. Фактически - это константное выражение.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
01.02.2016, 21:45
Надеюсь, Nishen, ты всё понял.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.02.2016, 21:49
nd2, Croessmah, я провел эксперимент со студиным компилятором из 2013 Community.
Создал проект из двух файлов и один заголовочный файл. В заголовочном файле такая структура:
C++
1
2
3
4
struct example
{
    static const int intNumber = 1;
};
Подключил его в файл A и в файл B. В каждом файле по функции, обе функции выводят адрес intNumber.
Обе функции вызвал в main. Адреса - разные.
Это очень интересный факт, потому что это значит, что студия считает intNumber переменной с внутренним связыванием (т.е. как обычную глобальную константу), что противоречит вот этому: (9.4.2/5)
Static data members of a class in namespace scope have the linkage of that class
Не говоря уже про это [ну это и так понятно]: (9.4.2/2)
The declaration of a static data member in its class definition is not a definition
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
01.02.2016, 23:11

Не по теме:

DrOffset, доберусь до пк, посмотрю. Сейчас со смартфона, крайне неудобно что-либо делать )))



Добавлено через 1 час 13 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Это очень интересный факт
Блин, сначала как-то не правильно прочитал,
думал, что все компиляторы так делают, а Вы только про студию.
Видимо, у cl свой взгляд на это.
А если добавить volatile?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
02.02.2016, 00:11
Цитата Сообщение от DrOffset Посмотреть сообщение
я провел эксперимент со студиным компилятором из 2013 Community.
В 10-й студии, одинаковые адреса выводятся.

Добавлено через 38 минут
Или я что-то не так делаю, но у меня и в 13-й студии одинаковые адреса выводятся.
Функции такие?
C++
1
2
3
4
void foo1()
{
    cout << &example::intNumber << endl;
}
В h.h (подключен к двум .cpp с реализациями функций):
C++
1
2
3
4
struct example
{
     static const int intNumber = 1;
};
main:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "h.h"
//...
 
void foo1()
{
    cout << &example::intNumber << endl;
}
 
void foo2();
 
int main()
{
   foo1();
   foo2();
}
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
02.02.2016, 01:57
DrOffset, Croessmah, nd2,
студия вообще это не должно линковаться
Баг https://connect.microsoft.com/... ils/813845
Поправлен только недавно http://blogs.msdn.com/b/vcblog... s2015.aspx
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
02.02.2016, 02:08
ct0r, да просто уже интересно, сколько еще там таких нежданчиков
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
02.02.2016, 03:37
Цитата Сообщение от Nishen Посмотреть сообщение
Да, кстати, читал на сайте microsoft, что любое объявление является определением (кроме ряда случаев, перечисленных там).
Наоборот.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
02.02.2016, 08:43

Не по теме:

Цитата Сообщение от ct0r Посмотреть сообщение
вообще это не должно линковаться
Да это понятно :) Выше же я цитату давал из стандарта почему не должно.



Цитата Сообщение от nd2 Посмотреть сообщение
но у меня и в 13-й студии одинаковые адреса выводятся
Сервис паки может быть стоят какие-то (у меня 2013 Community Update 5). Бывает они исправляют... или наоборот
Правда пример чуть другой был:
C++
1
2
3
4
5
6
7
8
void foo1();  // здесь печатает &example::intNumber
void foo2(int const * p); //здесь печатает p 
 
int main()
{
   foo1();
   foo2(&example::intNumber);
}
Но это не должно никак влиять.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
02.02.2016, 17:19
Цитата Сообщение от Mr.X Посмотреть сообщение
Наоборот.
На сайте пишут, как в стандарте написано:
3.1
2. A declaration is a definition unless ...
На сайте microsoft:
Declarations also serve as definitions, except when the declaration: ...
Объявления также служат как определения. Исключение составляют ситуации, когда объявление: ...
Добавлено через 13 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
у меня 2013 Community Update 5
У меня: Microsoft Visual Studio Express 2013 для Windows Desktop
Версия 12.0.30723.00 Update 3.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2016, 17:19
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru