|
Злостный нарушитель
10246 / 5673 / 1262
Регистрация: 12.03.2015
Сообщений: 26,284
|
|
Чертовщина с #include guards и #pragma once25.12.2019, 19:57. Показов 3753. Ответов 41
Метки #pragma once (Все метки)
Господа, у меня тут творится какая-то хрень: что бы я ни делал, h-файл инклудится дважды и константы, описанные в нём, в разных модулях имеют разные адреса! Рядышком, ага.
Что я делаю не так? И как это вообще можно объяснить? ---- Тестировал в CodeBlocks и DevCpp, компайлер mingw (gcc).
0
|
|
| 25.12.2019, 19:57 | |
|
Ответы с готовыми решениями:
41
Работа с файлами в C# с исп. библиотек #include <stdio.h> #include <stdlib.h> #include <math.h> #include <io.h> #include<iostream>// подключение библиотек #include <conio.h> #include <climits> Чем отличается #include <cstring>, #include <string> и #include <string.h>? |
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
|||
| 25.12.2019, 20:20 | |||
.c файла в проекте: prf.c и main.c. И каждый включает var.h. Вот и получается два независимых включения и два сообщения. Почему вас это удивляет?И константы у вас с внутренним связыванием - разумеется, они дадут отдельную копию в каждой единице трансляции, со своим адресом в каждой единице трансляции. При чем здесь #include guards и #pragma once вообще? #include guards и #pragma once предотвращают множественное включение заголовочного файла в одну и ту же единицу трансляции. Они ничего не меняют и ни на что не влияют в вопросах включения в разные единицы трансляции. Эта тема вообще не имеет никакого отношения к #include guards и #pragma once. #include guards и #pragma once - это обычные команды препроцессора. В них нет никакой "магии". Они не могут никаким волшебным образом повлиять на то, как будет обрабатываться другие единицы трансляции.
0
|
|||
|
Злостный нарушитель
10246 / 5673 / 1262
Регистрация: 12.03.2015
Сообщений: 26,284
|
|||||||
| 25.12.2019, 20:23 [ТС] | |||||||
|
Цель: объявить ГЛОБАЛЬНУЮ константу для всего приложения и глобальный константный указатель на неё. Я хочу понять, почему не срабатывает это:
0
|
|||||||
|
фрилансер
6446 / 5641 / 1128
Регистрация: 11.10.2019
Сообщений: 15,007
|
|
| 25.12.2019, 20:26 | |
|
Verevkin, сделай объявление в каком-то одном с-файле, а во всех остальных нужных местах - extern. Тогда будет один экземпляр
0
|
|
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
||||||||
| 25.12.2019, 20:30 | ||||||||
|
В языке С++ проще всего это сделать при помощи inline extern const
extern const объявления, а в одном из файлов реализации - определения.С таким же успехом вы могли написать комментарий рядом со своей переменной "Приказываю компилятору сделать ГЛОБАЛЬНУЮ константу для всего приложения!!!111" и потом удивляться, что ваш приказ компилятору "не срабатывает".
0
|
||||||||
|
Злостный нарушитель
10246 / 5673 / 1262
Регистрация: 12.03.2015
Сообщений: 26,284
|
||
| 25.12.2019, 20:30 [ТС] | ||
|
0
|
||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 25.12.2019, 20:33 | ||
|
Добавлено через 50 секунд компиляция то раздельная
0
|
||
|
фрилансер
6446 / 5641 / 1128
Регистрация: 11.10.2019
Сообщений: 15,007
|
||
| 25.12.2019, 20:36 | ||
)
0
|
||
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
|
| 25.12.2019, 20:36 | |
|
Для чего предназначены #include guards и #pragma once и что именно они делают, тут уже сто раз объяснялось. Они работают лишь в локальном изолированном мире одной единицы трансляции. На глобальные вопросы они никакого влияния они оказывают и оказывать не могут. По-моему, это должно быть очевидно.
0
|
|
|
Злостный нарушитель
10246 / 5673 / 1262
Регистрация: 12.03.2015
Сообщений: 26,284
|
|||
| 25.12.2019, 20:38 [ТС] | |||
|
Кликните здесь для просмотра всего текста
Другие варианты есть?
0
|
|||
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
||
| 25.12.2019, 20:42 | ||
var.h инклудится трижды: два раза в main.c и один раз в prf.c.В main.c он инклудится два раза: напрямую и через посредство prf.h. Вот тут-то как раз и сработали ваши #include guards и #pragma once. Они предотвратили двойное включение var.h в main.c и предотвратили ошибку duplicate identifier в main.c.Так что ваши #include guards прекрасно сработали и сделали все, что могли: сделали именно то, для чего они предназначены. А то, что ваш файл еще включается в prf.c к этой теме никакого отношения не имеет. Никакого "ошибки duplicate identifier" между разными единицами трансляции не бывает. И обеспечивать соблюдение ODR (и ваших пожеланий) между разными единицами трансляции - исключительно ваша задача. Никакие #include guards вам в этом не помогут.
0
|
||
|
45 / 33 / 15
Регистрация: 29.04.2014
Сообщений: 225
|
||||||
| 25.12.2019, 20:44 | ||||||
0
|
||||||
|
Злостный нарушитель
10246 / 5673 / 1262
Регистрация: 12.03.2015
Сообщений: 26,284
|
|||
| 25.12.2019, 20:48 [ТС] | |||
|
Получается, что директива #define XXX определяет идентификатор ХХХ только до конца файла, а не всей программы? Да ну, бред какой-то! Добавлено через 1 минуту
0
|
|||
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
||
| 25.12.2019, 20:54 | ||
|
Зрителям: Откуда, блин, лезут эти дикие мифы о какой-то глобальной магической силе #include guards? Ведь это же элементарная и совершенно очевидная функциональность препроцессора. Сразу же должно очевидно, что к вопросам ODR она никакого отношения не имеет и помочь ничем не может.
0
|
||
|
Злостный нарушитель
10246 / 5673 / 1262
Регистрация: 12.03.2015
Сообщений: 26,284
|
||
| 25.12.2019, 20:56 [ТС] | ||
|
0
|
||
|
фрилансер
6446 / 5641 / 1128
Регистрация: 11.10.2019
Сообщений: 15,007
|
|||
| 25.12.2019, 20:56 | |||
|
ещё вариант - вернуть ссылку на статическую переменную, объявленную внутри функции
0
|
|||
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
|||
| 25.12.2019, 20:58 | |||
|
0
|
|||
|
Злостный нарушитель
10246 / 5673 / 1262
Регистрация: 12.03.2015
Сообщений: 26,284
|
||
| 25.12.2019, 21:02 [ТС] | ||
|
0
|
||
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
||
| 25.12.2019, 21:02 | ||
|
И это было бы странно, ибо для h-файлов это не нужно и вредно. Сама идея h-файлов требует, чтобы они включались в каждую единицу трансляции, обычно ровно по одному разу.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 25.12.2019, 21:02 | |||
|
что бы хэдер не цеплялся каждый раз заново, можно глянуть в сторону предварительно скомпилированного заголовка хотя не понятно, чем тебя extern не устраивает
0
|
|||
| 25.12.2019, 21:02 | |
|
Помогаю со студенческими работами здесь
20
Чертовщина на рамблере Shift и чертовщина... Чертовщина с KWrite
Warning: include(1) [function.include]: failed to open stream: No such file or directory in Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД 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. . .
|