ViKo 1 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба Так мои Variable - это не объекты, а константы. Чисто для подстановки. В чем разница в данном случае между const и constexpr? inline функции, опять же, только в h-файлах мне удается использовать. Не помогает ни -multifile для компилятора, ничего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 7 minutes ago, ViKo said: Так мои Variable - это не объекты, а константы. Как только дали тип какой-то Variable, она стала объектом, const - это лишь квалификатор доступа к объекту. Почитайте мануал хотя бы по голому С. Quote В чем разница в данном случае между const и constexpr? Вам нужно четко разделять такие понятия: препроцессор и компилятор. Для этого желательно по-читать мануал на язык. Там это очень хорошо описано. Если говорить просто: const - "пропускается" через компилятор, а constexpr - через препроцессор (по аналогии с #define). Но чтобы не забивать голову constexpr, сделайте все так, как я описал в прошлом посте. Все будет работать ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 3 минуты назад, Forger сказал: Как только дали тип какой-то Variable, она стала объектом, const - это лишь квалификатор доступа к объекту. Почитайте мануал хотя бы по голому С. Так вот я и вижу разницу между С и С++. У меня определены константы показанным выше способом в одном h-файле, а используются в другом файле. И этим константам не потребовалось задавать extern. Как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 16 июля, 2019 Опубликовано 16 июля, 2019 (изменено) · Жалоба 6 minutes ago, ViKo said: Так вот я и вижу разницу между С и С++. Для данной ситуации нет никакой разницы между C и C++. Вы используете примитивные вещи из голого С. Конечно они будут работать в С++. Quote У меня определены константы показанным выше способом в одном h-файле, а используются в другом файле. И этим константам не потребовалось задавать extern. Как? Сделайте инклуд этого h-файла с вашей const (без extern) в еще каком-нить С/С++ файле ... Посмотрите, что на это скажет линкер. 14 minutes ago, Forger said: Почитайте мануал хотя бы по голому С. Изменено 16 июля, 2019 пользователем Forger Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 3 минуты назад, ViKo сказал: Так вот я и вижу разницу между С и С++. У меня определены константы показанным выше способом в одном h-файле, а используются в другом файле. И этим константам не потребовалось задавать extern. Как? Значит этот "один h-файл" где-то подключается перед тем, "другим". Поставьте в компиляторе галку "выводить результат работы препроцессора в файл" и убедитесь в этом. А всякие грозные нравоучения "Нельзя там-то и там-то!" - не слушайте. Я и сам где необходимо объявляю и определяю переменные и функции (inline) в хидерах. И в чужих (авторитетных) исходниках это многократно видел. Все такие нравоучения - лишь религиозная нетерпимость Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 2 минуты назад, Forger сказал: Сделайте инклуд этого h-файла с вашей const (без extern) в еще каком-нить С/С++ файле ... У меня в нем #pragma once стоит, а включается везде. 1 минуту назад, jcxz сказал: Значит этот "один h-файл" где-то подключается перед тем, "другим". Естественно, подключается. Но почему для этих констант, в отличие от переменных, не требуется указывать extern? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 3 minutes ago, ViKo said: У меня в нем #pragma once стоит, а включается везде. Она тут ни при чем, хотя вещь крайне удобная. Вставьте ваш h-файл (где объявлена const без extern) как минимум в два разных исходника (неважно С или С++) и сделайте сборку проекта (линковку), не компиляцию, а сборку. Посмотрите что скажет линкер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 8 минут назад, ViKo сказал: Естественно, подключается. Но почему для этих констант, в отличие от переменных, не требуется указывать extern? Потому что extern - это указание компилятору, что переменная/константа объявлены где-то в другом месте. И в таблице импорта obj-должна быть сделана об этом соответствующая запись, которая потом будет обработана на этапе связывания (линковки). А если вы подключаете само определение переменной/константы (а не объявление), то сама переменная оказывается определённой в этом файле. И для неё не будет записи в таблице импорта .obj, а будет запись в таблице экспорта .obj. И для переменной компоновщик потом выдаст ошибку о дублировании (два объекта одного типа не const в двух разных таблицах экспорта - не понятно какую использовать для соответствующей записи таблицы импорта другого .obj), а константы с одинаковым содержимым он просто молча объединит, удалив дубликат. Всё ведь логично. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба Однако, справедливости ради попробовал сделать это одном из своих С++ проектов - линкер не заругался, съел эту "запрещенную конструкцию" Убираю const - ругается линкер как и должен. Не понимаю. Пора читать мануалы и мне Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 1 минуту назад, Forger сказал: Однако, справедливости ради попробовал сделать это одном из своих С++ проектов - линкер не заругался ... Если Вы говорите о константах - само собой разумеется. Поэтому в хидерах их можно объявлять+определять спокойно. Можно и переменные там определять, но требуется больше телодвижений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 1 minute ago, jcxz said: Можно и переменные там определять, но требуется больше телодвижений. Это уже что-то лютое. Предпочитаю классические способы объявления объектов объектных файлах )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 5 минут назад, jcxz сказал: Можно и переменные там определять, но требуется больше телодвижений. Так, как я здесь же показывал? #ifndef VARS_DEFINE# define DECLARE extern# define INITIAL(x) #else# define DECLARE # define INITIAL(x) = x#endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 10 минут назад, ViKo сказал: Так, как я здесь же показывал? Да, примерно так. Только не забывать в конце этого .h-файла сделать #undef для DECLARE и INITIAL(). "Почему" - догадайтесь сами Примерно так: #ifdef SHARE_C #define STK_HEAD __no_init OS_STK #define STK_TAIL __align8 @ ".bssStk" #define STK_MAIN_TAIL __align8 @ ".bssStkMain" #else #define STK_HEAD extern __no_init OS_STK #define STK_TAIL #define STK_MAIN_TAIL #endif STK_HEAD stkTaskMain[128 + STK_SIZE_ISR_NFP] STK_MAIN_TAIL; STK_HEAD stkExcept[EXCEPT_STK_SIZE] STK_TAIL; STK_HEAD stkPeriodic[96 + STK_SIZE_ISR_NFP] STK_TAIL; STK_HEAD stkMenu[200 + STK_SIZE_ISR_NFP] STK_TAIL; ... #undef STK_HEAD #undef STK_TAIL #undef STK_MAIN_TAIL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 36 минут назад, jcxz сказал: "Почему" - догадайтесь сами У меня эти DECLARE и INITIAL используются во многих h-файлах. Не могу представить, как можно "забыть" эти определения и задавать глобальные переменные там, где возникает в этих переменных потребность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 16 июля, 2019 Опубликовано 16 июля, 2019 · Жалоба 17 minutes ago, ViKo said: Не могу представить, как можно "забыть" эти определения и задавать глобальные переменные там, где возникает в этих переменных потребность. Можно. Решатся просто - вообще не использовать глобальные. Но это - уже совсем другая история ... ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться