Тонкости C/C++

Тема в разделе "LANGS.C", создана пользователем Nafanya, 5 фев 2011.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Nafanya

    Когда закончишь школу и попробуешь свой "профессионализм" в команде, поймешь о чем я говорю. Представь себе, что ты написал функцию, и она принимает параметр по константной ссылке или указателю на константу. Ты отдаешь эту функцию коллеге. Он будет ее где-то как-то вызывать. Можно ли внутри этой функции отменять константность через const_cast? Вот это и зависит от того, каким образом была объявлена та сущность, ссылку или указатель на которую тебе передали.

    Пока твое "по программировать" заключается в написании поделочек вроде "угадывание числа", введенного в stdin, то конечно же, проблема будет казаться надуманной. Однако, после вступления во взрослую жизнь, многие вещи станут более понятными.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Какие ахтунги. const_cast - ахтунг, для применения в ахтунговом коде.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Это все экспрессия :) const_cast - неотъемлимая часть языка, законный оператор, подчиняющийся определенным правилам.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Booster
    Очень интересно. И как предлагаете в следующем коде избавиться от const_cast?
     
  5. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    вся надежда когда переписываеш код через какое то время
    на const в параметрах функции сразу ясно как поменять
    если кто то будет тайком менять параметр объявленный const
    это ахтунг
    еще VS const помещает в PAGE_READONLY
    снимаеш константность и падаеш с access violation
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    кстати про трудоустройство:
    http://www.coolinterview.com/type.asp?iType=444
    возможные вопросы интервью при трудоустройстве к мелкомягким, для сравнения)

    ЗЫ ни разу не использовал const_cast... полет нормальный...
    зачем инициализировать класс, если он здесь никоим образом не нужен?
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    l_inc
    Так.
     
  8. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    _DEN_
    6 лет назад закончил. Кстати прикольные были годы... Но в универе как-то интересней было учиться...
    Ага, мы на лабах пять лет угадывали число, вводимое юзером с клавиатуры, используя современные методы теорвера и статистического анализа, а наши исследования в этой области курировали профессора и доценты.:) Под конец я написал на это тему выпускную дипломную работу:)
    Дитё, когда ты угомонишься наконец?
     
  9. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    ну к чему этот смех? ))
     
  10. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Интересный код:
    Код (Text):
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. #define DF(N) void N() { \
    5.    cout << "function " #N " called..." << endl; }
    6.  
    7. DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g);
    8.  
    9. void (*func_table[])() = { a, b, c, d, e, f, g };
    10.  
    11. int main() {
    12.   while(1) {
    13.     cout << "press a key from 'a' to 'g' "
    14.       "or q to quit" << endl;
    15.     char c, cr;
    16.     cin.get(c); cin.get(cr); // second one for CR
    17.     if ( c == 'q' )
    18.       break; // ... out of while(1)
    19.     if ( c < 'a' || c > 'g' )
    20.       continue;
    21.     (*func_table[c - 'a'])();
    22.   }
    23. }
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    вот в ту же тему:
    Код (Text):
    1. #define FUNC2(x,y) x##y
    2. #define FUNC1(x,y) FUNC2(x,y)
    3. #define FUNC(x) FUNC1(x,__COUNTER__)
    4. int FUNC(my_unique_prefix);
    5. int FUNC(my_unique_prefix);
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Nafanya
    Что тут интересного?
     
  13. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Booster
    Пользователь через терминал осуществляет выбор вызываемой функции. Функции сжато определены с использованием макросов.
    Rel
    Вы не могли бы привести пример простого make-файла для студии. Что-то там какой-то у них формат особенный. Думаю попробовать собрать проект используя makefile с зависимостями, как рекомендует автор книги. Кстати синтаксис make-файлов, описанный в книге, студия не понимает - для Линухи походу. (Ни разу так не делал, всегда все автоматом собирал).
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Nafanya
    http://msdn.microsoft.com/ru-ru/library/dd9y37ha.aspx

    Не вижу смысла в данном случае.
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Booster
    Да... смешная шутка. Это Вы так согласились, что без const_cast там не обойтись или просто не поняли, что wstring там только для упрощения примера в виде предопредлённого значения? А на самом деле вполне может быть аргументом функции. И, скажем, дальше по коду требуется из него выделять substr, а потом сравнивать с какой-нибудь другой строкой... короче, нужен wstring и без него никак. Итак, как в таком случае избавиться от const_cast?
     
  16. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Код (Text):
    1. const char* constString = "What the fuck!";
    2. char* String = (char*)constString;
    3. printf("%s\n", String);
    Код (Text):
    1. const char* constString = "What the fuck!";
    2. const char* subStr = "the";
    3. char Buf[256];
    4. memset(Buf, 0, 256);
    5. strstr(constString, subStr);
    6. if(subStr) { memcpy(Buf, subStr, strlen(subStr)); }
    7. printf("%s\n", Buf);
    будьте проще)))

    если объект передается по константной ссылке, то может быть и не обойтись... а тут не зачем, мне кажется)
     
  17. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Rel
    C от C++ вообще отличаете? Или предлагаете писать только на C?
     
  18. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    я предлагаю вам не использовать надуманные алгоритмы там, где можно обойтись простыми...
     
  19. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Rel
    Пустые слова. Без обоснования, без смысла.
     
  20. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Rel
    Зачастую "простота - хуже воровства". Особенно, если речь идёт о серьёзном проекте, а не какой-нибудь утилитке.