|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
Чертовщина с #include guards и #pragma once25.12.2019, 19:57. Показов 4232. Ответов 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>? |
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
|
||
| 25.12.2019, 21:04 | ||
|
Вы же объявили переменные с внутренним связыванием. Они линкеру вообще не видны. А если бы и были видны, ругаться на них он все равно не имел бы права.
0
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 25.12.2019, 21:08 [ТС] | |
|
0
|
|
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
|
||
| 25.12.2019, 21:18 | ||
|
В языке С++ в том числе именно эту проблему решили путем введения inline переменных. В С же, если такие оптимизации критичны, пришлось бы вертеться как-то по-другому...Но это все может быть критично скорее для скаляров. А вам, как я понял, в реальном коде нужен совсем не скаляр, а какой-то "тяжелый" объект. Тогда без вариантов: раздельное объявления/определение.
0
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|||
| 25.12.2019, 21:24 [ТС] | |||
|
Добавлено через 6 минут Короче, нужно, чтоб в любом месте исходника си-программы были доступны этот указатель и размер. А пока у меня данные дублируются и указатели содержать разные адреса. --------- Как это лучше организовать?
0
|
|||
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
|
||
| 25.12.2019, 21:28 | ||
static, то есть они локальные для каждой единицы трансляции. До тех пор, пока вы static сущности будете неоправданно называть "глобальными", будет получаться вот такая "удивительная" чушь.А про "одинаковые имена" меня вообще безмерно удивило. Для чего же по-вашему предназначен static в языке C??? static для того и предназначен, чтобы вы могли спокойно объявлять переменные и функции локальными для данной единицы трансляции, т.е. не беспокоиться о потенциальных конфликтах имен с другими единицами трансляции.
0
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||
| 25.12.2019, 21:34 [ТС] | ||
|
Чо делать-то?
0
|
||
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
|
|||
| 25.12.2019, 21:41 | |||
|
Я только до сих пор не понял, о каком языке идет речь. Форум по С++. В проекте - явно С. Для внешних объявлений роль static заключается именно в управлении связыванием: внешнее или внутреннее.
0
|
|||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||||||||||||||||||||||
| 25.12.2019, 21:50 [ТС] | ||||||||||||||||||||||
|
----- extern не помог. Всё равно указатели имеют разные значения. main.c
0
|
||||||||||||||||||||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 25.12.2019, 21:51 [ТС] | |
|
0
|
|
|
фрилансер
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,332
|
||||||
| 25.12.2019, 21:55 | ||||||
|
Verevkin, вот два варианта решения. Выбирай, что больше понравится
1
|
||||||
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
|
||||||||||||
| 25.12.2019, 22:13 | ||||||||||||
|
Сколько раз уже повторили: никакого static в ваших объявлениях быть не должно. И определения переменных ни в коем случае не должны располагаться в заголовочном файле. В заголовочном файле допустимы только объявления переменных.var.h
prf.c (или любой другой .с файл)
0
|
||||||||||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||
| 25.12.2019, 22:21 [ТС] | ||
|
Весь вопрос родился из-за того, чтоб использовать константы, определённые в одном месте программы, где угодно, просто обращаясь к ним через имя.
0
|
||
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
|
|||
| 25.12.2019, 22:45 | |||
|
0
|
|||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||
| 25.12.2019, 22:55 [ТС] | ||
|
Казалось, задача тривиальная. А вот хрен.
0
|
||
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
|
||||
| 25.12.2019, 23:13 | ||||
|
Вся "нетривиальность" сводится лишь к продиранию через дебри постороннего шума (#include guards и т.п.), который к этой задаче не имеет абсолютно никакого отношения и который вы сюда нагнали в огромных количествах. Добавлено через 2 минуты Или наоборот, если вы хотите доступаться к таблице именно через отдельный указатель, то саму таблицу можно где-то "спрятать", т.е. сделать static а каком-то файле реализации, но вот указатель придется сделать глобальным именно теми методами, которые мы описали выше.
1
|
||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||||
| 25.12.2019, 23:17 [ТС] | ||||
|
0
|
||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 25.12.2019, 23:58 [ТС] | |
|
Задача решена, скилл прокачан.
Всем участникам спасибо. Кому интересно - прицепляю тестовый исходник.
0
|
|
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,320
|
|||
| 26.12.2019, 01:50 | |||
|
Добавлено через 18 минут Остается только вопрос о том, почему у вас сами указатели не являются константными. Вам нужно иметь возможность их изменять?
0
|
|||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 26.12.2019, 08:16 [ТС] | |
|
0
|
|
|
фрилансер
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,332
|
|
| 26.12.2019, 08:38 | |
|
Verevkin, наверное, имеется в виду константность самого объекта указателя
const uint32_t* const pTABLE=TABLE; И я тоже не понимаю, зачем этот указатель вообще нужен. Можно таблицу сделать не static и пусть торчит себе наружу. указатель тут - лишний.
0
|
|
| 26.12.2019, 08:38 | |
|
Чертовщина на рамблере Shift и чертовщина... Чертовщина с KWrite
Warning: include(1) [function.include]: failed to open stream: No such file or directory in Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|