|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
Чертовщина с #include guards и #pragma once25.12.2019, 19:57. Показов 4226. Ответов 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>? |
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
||
| 25.12.2019, 21:04 | ||
|
Вы же объявили переменные с внутренним связыванием. Они линкеру вообще не видны. А если бы и были видны, ругаться на них он все равно не имел бы права.
0
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 25.12.2019, 21:08 [ТС] | |
|
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
||
| 25.12.2019, 21:18 | ||
|
В языке С++ в том числе именно эту проблему решили путем введения inline переменных. В С же, если такие оптимизации критичны, пришлось бы вертеться как-то по-другому...Но это все может быть критично скорее для скаляров. А вам, как я понял, в реальном коде нужен совсем не скаляр, а какой-то "тяжелый" объект. Тогда без вариантов: раздельное объявления/определение.
0
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|||
| 25.12.2019, 21:24 [ТС] | |||
|
Добавлено через 6 минут Короче, нужно, чтоб в любом месте исходника си-программы были доступны этот указатель и размер. А пока у меня данные дублируются и указатели содержать разные адреса. --------- Как это лучше организовать?
0
|
|||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
||
| 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
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
|||
| 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
|
|
|
фрилансер
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,316
|
||||||
| 25.12.2019, 21:55 | ||||||
|
Verevkin, вот два варианта решения. Выбирай, что больше понравится
1
|
||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
||||||||||||
| 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
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
|||
| 25.12.2019, 22:45 | |||
|
0
|
|||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||
| 25.12.2019, 22:55 [ТС] | ||
|
Казалось, задача тривиальная. А вот хрен.
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
||||
| 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
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
|
|||
| 26.12.2019, 01:50 | |||
|
Добавлено через 18 минут Остается только вопрос о том, почему у вас сами указатели не являются константными. Вам нужно иметь возможность их изменять?
0
|
|||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 26.12.2019, 08:16 [ТС] | |
|
0
|
|
|
фрилансер
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,316
|
|
| 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Калькулятор для расчета родства
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 реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|