Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
06.07.2021, 22:05
|
|||
---|---|---|---|
не могу посчитать количество строк в массиве. |
|||
#18+
если имеем 3 файла main.cpp , constants.cpp, constants.hpp, то вот это не компилируется : constants.cpp: Код: plaintext 1. 2.
constants.hpp: Код: plaintext 1. 2. 3. 4.
main.cpp : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
но если это сделать в одном файле, то всё ОК: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 00:06
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
andron81 constants.hpp: Код: plaintext 1. 2. 3. 4.
sizeof() дает размер типа данных, а не размер конкретного экземпляра этого типа в памяти. Ну ты "недоопределил" тип данных массива arr, указав []. Определение для const должно быть тут же, в объявлении, если бы не extern. Но ты указал extern, в итоге, в .hpp имеем лишь указатель на где-то определенные данные, связь с определением в .cpp переложена на момент линковки. Main() ничего не знает об определении, видит только объявление, вот и "ругается". Определи в .hpp, и всё будет хорошо. Ну, если не забывать возможности повторного объявления (используй inline). :) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 08:22
|
|||
---|---|---|---|
не могу посчитать количество строк в массиве. |
|||
#18+
ъъъъъ andron81 constants.hpp: Код: plaintext 1. 2. 3. 4.
sizeof() дает размер типа данных, а не размер конкретного экземпляра этого типа в памяти. Ну ты "недоопределил" тип данных массива arr, указав []. Определение для const должно быть тут же, в объявлении, если бы не extern. Но ты указал extern, в итоге, в .hpp имеем лишь указатель на где-то определенные данные, связь с определением в .cpp переложена на момент линковки. Main() ничего не знает об определении, видит только объявление, вот и "ругается". Определи в .hpp, и всё будет хорошо. Ну, если не забывать возможности повторного объявления (используй inline). :) опредеделять в hpp разве по феншую ? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 08:40
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
andron81, если новая версия компилятора и нужна глобальная переменная - то да, рекомендуют. Из плюсов: например, меньше вероятность получить облом "повтор имени" на этапе линковки: главное, чтобы имя переменной было уникально лишь в рамках единицы компиляции. Ну и - как у тебя, тип сразу известен. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 11:55
|
|||
---|---|---|---|
не могу посчитать количество строк в массиве. |
|||
#18+
ъъъъъ andron81 constants.hpp: Код: plaintext 1. 2. 3. 4.
sizeof() дает размер типа данных, а не размер конкретного экземпляра этого типа в памяти. Ну ты "недоопределил" тип данных массива arr, указав []. Определение для const должно быть тут же, в объявлении, если бы не extern. Но ты указал extern, в итоге, в .hpp имеем лишь указатель на где-то определенные данные, связь с определением в .cpp переложена на момент линковки. Main() ничего не знает об определении, видит только объявление, вот и "ругается". Определи в .hpp, и всё будет хорошо. Ну, если не забывать возможности повторного объявления (используй inline). :) сегодня я это переварил. прихожу к выводу , что лучше писать размер во всех файлах . вот так arr[4][4] ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 12:41
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
andron81, Ещё можно std::array использовать. В нем есть информация о размере и тапе элемента. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 13:31
|
|||
---|---|---|---|
не могу посчитать количество строк в массиве. |
|||
#18+
ъъъъъ Ещё можно std::array использовать. А ещё лучше std::vector. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 18:47
|
|||
---|---|---|---|
не могу посчитать количество строк в массиве. |
|||
#18+
ъъъъъ andron81, если новая версия компилятора и нужна глобальная переменная - то да, рекомендуют. Из плюсов: например, меньше вероятность получить облом "повтор имени" на этапе линковки: главное, чтобы имя переменной было уникально лишь в рамках единицы компиляции. Ну и - как у тебя, тип сразу известен. Т.е. вы хотите сказать, что в новом стандарте С++ переменную определяют в *.h с помощью спецификатора inline? Мне кажется, вы не слишком ясно выразились. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 18:54
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
petravТ.е. вы хотите сказать, что в новом стандарте С++ переменную *определяют* в *.h с помощью спецификатора inline? Вы не поверите... https://en.cppreference.com/w/cpp/language/inline Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 19:21
|
|||
---|---|---|---|
не могу посчитать количество строк в массиве. |
|||
#18+
Dimitry Sibiryakov petravТ.е. вы хотите сказать, что в новом стандарте С++ переменную *определяют* в *.h с помощью спецификатора inline? Вы не поверите... https://en.cppreference.com/w/cpp/language/inline Т.е. можно не писать так: Код: plaintext 1. 2. 3. 4.
А просто написать: Код: plaintext 1. 2.
Я не знал об этом. Нужно поискать статью на Хабре. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 19:58
|
|||
---|---|---|---|
не могу посчитать количество строк в массиве. |
|||
#18+
ъъъъъ andron81, если новая версия компилятора и нужна глобальная переменная - то да, рекомендуют. Окей, с этим разобрались. Определяем глобальную переменную как inline в *.h. ъъъъъ Из плюсов: например, меньше вероятность получить облом "повтор имени" на этапе линковки: главное, чтобы имя переменной было уникально лишь в рамках единицы компиляции. Ну и - как у тебя, тип сразу известен. Но тут то, что написано и как это понять? Складывается впечатление, что переменная определённая в *.h как inline становится static (аналог анонимного пространства имён). Но я вижу, что это не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 20:50
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
petrav, есть вопрос? Cформулируй. "Как это понять?" - не вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 20:54
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
petrav Но тут то, что написано и как это понять? Складывается впечатление, что переменная определённая в *.h как inline становится static (аналог анонимного пространства имён). Но я вижу, что это не так. Тут все написано https://en.cppreference.com/w/cpp/language/inline Из всех копий inline остается только одна глобальная переменная. Так же как и с функциями. Основное достоинство inline переменных по сравнению с extern - возможность реализации любых header-only библиотек. Вспомогательная фича - они устраняют во многих случаях так называемый Initialization Order Fiasco , когда порядок инициализации между единицами трансляции не гарантируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 22:11
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
C extern: Пусть a.h Код: plaintext 1.
b.h Код: plaintext 1.
Тогда: 1. c.cpp Код: plaintext 1.
- компилируется, но не собирается. 2. c.cpp Код: plaintext 1. 2. 3. 4. 5.
- тоже компилируется и собирается, при линковке все ссылки на x разрешаются объектом в a.obj. 3. c.cpp Код: plaintext 1. 2. 3.
- тоже компилируется и собирается, при линковке все ссылки на x разрешаются объектом в a.obj. ~~~~~~~~~~~~~~~~~~ С inline. Пусть a.h Код: plaintext 1.
b.h Код: plaintext 1.
Тогда: c.cpp Код: plaintext 1. 2.
- не скомпилируется: повторное определение и многократная инициализация в рамках одной единицы компиляции c.cpp. Дополнительно. a.cpp Код: plaintext 1. 2.
b.cpp Код: plaintext 1. 2.
c.h Код: plaintext 1. 2.
тогда: c.cpp Код: plaintext 1. 2. 3. 4. 5. 6.
- компилируется и собирается, получаем разные "глобальные" x для единиц компиляции a.cpp и b.cpp. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 23:08
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
ъъъъъ, Какая разница что там выводится в результате UB? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 23:11
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
Anatoly Moskovsky, а где UB? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 23:35
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
ъъъъъ Пусть a.h Код: plaintext 1.
b.h Код: plaintext 1.
If an inline function or variable (since C++17) with external linkage is defined differently in different translation units, the behavior is undefined. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 23:44
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
Anatoly Moskovsky, не вижу, откуда тут может взяться "external linkage". Поясни, пожалуйста. ... Ага, нашел: по умолчанию. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.07.2021, 23:55
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
ъъъъъ Anatoly Moskovsky, не вижу, откуда тут может взяться "external linkage". Поясни, пожалуйста. ... Ага, нашел: по умолчанию. Спасибо. А в MSVS вроде как не external linkage, а вполне себе в компайл-тайме. Или я не разобрался. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
08.07.2021, 00:18
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
Начал читать: https://habr.com/ru/company/jugru/blog/506104/ - страшно, нафиг... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
08.07.2021, 00:19
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
Удалено ... |
|||
:
Нравится:
Не нравится:
|
|||
|
08.07.2021, 09:10
|
|||
---|---|---|---|
не могу посчитать количество строк в массиве. |
|||
#18+
Anatoly Moskovsky ъъъъъ, Какая разница что там выводится в результате UB? )) Это же должно быть нарушением ODR? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
08.07.2021, 10:11
|
|||
---|---|---|---|
не могу посчитать количество строк в массиве. |
|||
#18+
d7i ъъъъъ Ещё можно std::array использовать. А ещё лучше std::vector. в векторе я не умею хранить объекты класса. только указатели получается. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
08.07.2021, 10:26
|
|||
---|---|---|---|
|
|||
не могу посчитать количество строк в массиве. |
|||
#18+
andron81, Это не массив, а указатель. Ты ходишь по охриненно тонкому льду... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
08.07.2021, 10:30
|
|||
---|---|---|---|
не могу посчитать количество строк в массиве. |
|||
#18+
andron81, Код: plaintext 1. 2. 3. 4. 5.
crutchmaster andron81, Это не массив, а указатель. Ты ходишь по охриненно тонкому льду... Чего ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=57&tablet=1&tid=2017191]: |
0ms |
get settings: |
26ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
501ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 623ms |
0 / 0 |