Перейти к содержанию
    

Так мои Variable - это не объекты, а константы. Чисто для подстановки.

В чем разница в данном случае между const и constexpr?

inline функции, опять же, только в h-файлах мне удается использовать. Не помогает ни -multifile для компилятора, ничего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, ViKo said:

Так мои Variable - это не объекты, а константы.

Как только дали тип какой-то Variable, она стала объектом, const - это лишь квалификатор доступа к объекту. Почитайте мануал хотя бы по голому С.

 

Quote

В чем разница в данном случае между const и constexpr?

Вам нужно четко разделять такие понятия: препроцессор и компилятор. Для этого желательно по-читать мануал на язык. Там это очень хорошо описано.

Если говорить просто: const - "пропускается" через компилятор, а constexpr - через препроцессор (по аналогии с #define).

Но чтобы не забивать голову constexpr, сделайте все так, как я описал в прошлом посте. Все будет работать ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, Forger сказал:

Как только дали тип какой-то Variable, она стала объектом, const - это лишь квалификатор доступа к объекту. Почитайте мануал хотя бы по голому С.

Так вот я и вижу разницу между С и С++. У меня определены константы показанным выше способом в одном h-файле, а используются в другом файле. И этим константам не потребовалось задавать extern. Как?  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, ViKo said:

Так вот я и вижу разницу между С и С++.

Для данной ситуации нет никакой разницы между C и C++. Вы используете примитивные вещи из голого С. Конечно они будут работать в С++.

 

Quote

У меня определены константы показанным выше способом в одном h-файле, а используются в другом файле. И этим константам не потребовалось задавать extern. Как?  

Сделайте инклуд этого h-файла с вашей const (без extern) в еще каком-нить С/С++ файле ... Посмотрите, что на это скажет линкер.

 

14 minutes ago, Forger said:

Почитайте мануал хотя бы по голому С.

 

Изменено пользователем Forger

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, ViKo сказал:

Так вот я и вижу разницу между С и С++. У меня определены константы показанным выше способом в одном h-файле, а используются в другом файле. И этим константам не потребовалось задавать extern. Как?  

Значит этот "один h-файл" где-то подключается перед тем, "другим". Поставьте в компиляторе галку "выводить результат работы препроцессора в файл" и убедитесь в этом.

А всякие грозные нравоучения "Нельзя там-то и там-то!" - не слушайте. Я и сам где необходимо объявляю и определяю переменные и функции (inline) в хидерах. И в чужих (авторитетных) исходниках это многократно видел. Все такие нравоучения - лишь религиозная нетерпимость  :dash2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, Forger сказал:

Сделайте инклуд этого h-файла с вашей const (без extern) в еще каком-нить С/С++ файле ...

У меня в нем #pragma once стоит, а включается везде.

1 минуту назад, jcxz сказал:

Значит этот "один h-файл" где-то подключается перед тем, "другим". 

Естественно, подключается. Но почему для этих констант, в отличие от переменных, не требуется указывать extern?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, ViKo said:

У меня в нем #pragma once стоит, а включается везде.

Она тут ни при чем, хотя вещь крайне удобная.

Вставьте ваш h-файл (где объявлена const без extern) как минимум в два разных исходника (неважно С или С++) и сделайте сборку проекта (линковку), не компиляцию, а сборку. Посмотрите что скажет линкер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, ViKo сказал:

Естественно, подключается. Но почему для этих констант, в отличие от переменных, не требуется указывать extern?

Потому что extern - это указание компилятору, что переменная/константа объявлены где-то в другом месте. И в таблице импорта obj-должна быть сделана об этом соответствующая запись, которая потом будет обработана на этапе связывания (линковки).

А если вы подключаете само определение переменной/константы (а не объявление), то сама переменная оказывается определённой в этом файле. И для неё не будет записи в таблице импорта .obj, а будет запись в таблице экспорта .obj. И для переменной компоновщик потом выдаст ошибку о дублировании (два объекта одного типа не const в двух разных таблицах экспорта - не понятно какую использовать для соответствующей записи таблицы импорта другого .obj), а константы с одинаковым содержимым он просто молча объединит, удалив дубликат.

Всё ведь логично.  :wink2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Однако, справедливости ради попробовал сделать это одном из своих С++ проектов - линкер не заругался, съел эту "запрещенную конструкцию"  :mda:

Убираю const - ругается линкер как и должен. Не понимаю. Пора читать мануалы и мне :blush:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Forger сказал:

Однако, справедливости ради попробовал сделать это одном из своих С++ проектов - линкер не заругался ... :mda:

Если Вы говорите о константах - само собой разумеется. Поэтому в хидерах их можно объявлять+определять спокойно.

Можно и переменные там определять, но требуется больше телодвижений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jcxz said:

Можно и переменные там определять, но требуется больше телодвижений.

Это уже что-то лютое. Предпочитаю классические способы объявления объектов объектных файлах ))

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, jcxz сказал:

Можно и переменные там определять, но требуется больше телодвижений.

Так, как я здесь же показывал?

#ifndef VARS_DEFINE
#    define DECLARE        extern
#    define INITIAL(x)    
#else
#    define DECLARE        
#    define INITIAL(x)    = x
#endif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, ViKo сказал:

Так, как я здесь же показывал?

Да, примерно так. Только не забывать в конце этого .h-файла сделать #undef для DECLARE и INITIAL(). "Почему" - догадайтесь сами  :wink2:

Примерно так:

#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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 минут назад, jcxz сказал:

"Почему" - догадайтесь сами

У меня эти DECLARE и INITIAL используются во многих h-файлах. Не могу представить, как можно "забыть" эти определения и задавать глобальные переменные там, где возникает в этих переменных потребность.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 minutes ago, ViKo said:

 Не могу представить, как можно "забыть" эти определения и задавать глобальные переменные там, где возникает в этих переменных потребность.

Можно. Решатся просто - вообще не использовать глобальные. Но это - уже совсем другая история  ... ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...