Форум программистов, компьютерный форум CyberForum.ru

Чем же макрос define так плох? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ begin http://www.cyberforum.ru/cpp-beginners/thread83539.html
Люди, я собираюсь научиться программировать на Си,подскажите, с чего лучше всего начать в C++, и в какой среде мне будет проще обучаться программировать (Visual C++, Microsoft Visual Studio C++, C++ Builder и т.д.)??? Заранее благодарен!
C++ Как передать вектор из main() во внутреннюю функцию ? Нужно передать вектор из main в функцию gen_binar_sq , записать в него элементы, и получить в main заполненый вектор и распечатать элементы. #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <cctype> #include <iostream> #include <vector> http://www.cyberforum.ru/cpp-beginners/thread83535.html
Функция: удаление узла дерева со всеми потомками C++
подскажите код функции которая удаляет элемент дерева со всеми его потомками NODE *SEARCH(char *key, NODE *root) { NODE *cur=root; if(cur==NULL) { cout<<"\n Data Base is empty."; return cur; }
C++ Определение заглавных букв в файле.
Нужна программа на Си которая определяет слово с самым большим количеством заглавных букв(если таковых много, следует выдать их все).Помогите пожалуйста.Заранее благодарен.
C++ Отличие С от С++ http://www.cyberforum.ru/cpp-beginners/thread83520.html
В чем отличие языка С от С++
C++ Сортировка строк матрицы по возрастанию первых элементов Составить программу, которая переформирует заданную матрицу так, чтобы ее строки расспалагались в порядке возрастания их первых элементов. Помогите пожалуйста, я сколько не пытался, ничего не вышло... Заранее огромное спасибо подробнее

Показать сообщение отдельно
hoggy
5414 / 2213 / 410
Регистрация: 15.11.2014
Сообщений: 4,981
Завершенные тесты: 1
24.10.2015, 11:38     Чем же макрос define так плох?
Цитата Сообщение от Evg Посмотреть сообщение
Гадать нужно. Ибо товарищ не предоставил исходник, и чего он там мерил - непонятно
нет, не нужно.
потому что совершенно не важно:
ни что именно учудил товарищ,
ни что он там себе думает.

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

Цитата Сообщение от Evg Посмотреть сообщение
А что такое адрес константы - я вообще не понимаю. В твоём случае n - это автоматическая переменная, а не константа. Я вообще слабо понимаю, что вы тут придумали на предмет того, выделяется память под константу, или нет. Когда LynXzp об этом говорил, я ещё хоть как-то его понимал, потому что знал, что он на ломанном языке изъясняется (у него были опасения, что лишний define или элемент enum'а попадают в код). Что говоришь ты - я не понимаю вообще ничего
я думал, моя мысля - предельно проста и очевидна.
но на всякий случай оставил пример-иллюстрацию с выдержкой кода
и демонстрацией на онлайн компиляторе.

обратите внимание:
значение константы используется в качестве параметра шаблона.

это возможно только и только в одном случае:
константа времени компиляции.

по поводу адреса константы поясню:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int foo(const size_t*); //<--- реализация "где то там"
   // в другой единице трансляции
   // здесь будет резолвить линкер
 
int main()
{
    const size_t n = 10;
 
    int array[n] = {}; //<--- можно, 
         // n - константа, значение которой известно времени компиляции
 
    // <--- до этого момента память под константу n не выделялась
    // потому что нигде не использовался адрес константы
    // а для того, что бы организовать массив
    // компилятору достаточно сделать inline подстановку значения константы
  
    foo(&n); //<--- а вот теперь мы попросили адрес константы
     //компилятор обязан нам его предоставить
 
     //но что бы это было возможно
     //компилятор вынужден создать реальный объект константы
     //разместив его в памяти, что бы у него появился реальный адрес
     //который мы можем получить
 
     //удалите вызов функции foo,
     //и компилятор не станет выделять память под константу
}
Добавлено через 11 минут
Цитата Сообщение от Evg Посмотреть сообщение
По мне так если есть вопрос на предмет того, что и как попадает в код, то
читаешь стандарт языка.

а вот что там за ассмовыхлоп получится - монопенисуальный фактор,
и геммор компилятора, а не программиста.

вот вам ещё один пример:


C++
1
2
3
4
5
6
struct example
{
    static const int value = 10; // <--- законный способ объявления константы 
           //с бородатых времен
      // но почему?
};
почему стандарт требует объявлять статические члены классов явно в ед. трансляций,
но не требует этого для фундаментальных констант?

потому что не константы, или не фундаментальные типы нужно где то размещать в памяти.
в данном случае в статической.
и нужно знать - где.

но фундаментальные константы память не кушают.
поэтому их можно определить прямо в хэдере.

здесь мы кстати, наблюдаем один из величайших косяков в дизайне языка:
если мы попросим адрес у такой константы, то...
о боже! все будет по прежнему работать, как часики.

дело в том, что разработчики компиляторов,
уже давным давно порешали и проблему выделения памяти под константу.
и проблему выделения памяти под статическую фундаментальную константу.

поэтому, нет никаких технических ограничений,
применить механизм автоматической аллокации статического объекта,
определенного в хэдэре.

то есть, они ещё давным давно могли позволить определять в хэдерах
не только фундаментальные константы,
но и любые другие объекты.

в настоящий же момент ограничение "только для фундаментальных констант"
снято только и только для шаблонов.
 
Текущее время: 19:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru