- Некоторые тонкости С/С++, bogerm, 05:16 , 19-Сен-03 (1)
>Здрасти! >Вопрос такой: есть две строки >wait_queue_t *my1=NULL: Это стековый объект, значение my1 будет потеряно после выхода из области видимости данной переменной. Например при возврате из функции. >static struct wait_queue_t *my2=NULL; Переменная будет иметь старое значение после возврата в область видимости. Если же переменная объявлена как static внутри класса, то она становится общей для всех объектов этого класса. Вообще поведение переменной будет несколько различаться в зависимости от того, была ли она объявлена внутри функции, внутри класса или вне их. > >Вопрос: конкретно, чем отличаются типы созданных указателей? Типы указателей не отличаются. Просто переменные будут размещены в разных областях памяти. >И вдогону: в каких случаях требуется указывать ключевое слово <struct> >при объявлнии указателей на структуры? struct нужно всегда указывать в C и не нужно в C++. Но можно создать новый тип с помощью typedef и обойтись без ключевого слова struct при объявлении указателей. > >Также: >try{ >... >throw ("MAMA!"); >... >}catch(const char *error){ >... >} > >Вопрос: почему команда throw приводит к завершению программы по сигналу SIGABRT??? >А для чего тада были писаны каманды try и catch...? Не понял... Вроде должно работать: > cat testcatch.cc #include <iostream.h> int main( void ) { try { throw("Help!"); exit(1); } catch(const char *error) { cout << "Received: " << error << endl; } cout << "Finished\n"; return 0; } > g++ -o testcatch testcatch.cc > ./testcatch Received: Help! Finished
- Некоторые тонкости С/С++, Мартовский заец, 12:46 , 20-Сен-03 (2)
>>Здрасти! >>Вопрос такой: есть две строки >>wait_queue_t *my1=NULL: > >Это стековый объект, значение my1 будет потеряно после выхода из области видимости >данной переменной. Например при возврате из функции. > >>static struct wait_queue_t *my2=NULL; > >Переменная будет иметь старое значение после возврата в область видимости. >Если же переменная объявлена как static внутри класса, то она становится общей >для всех объектов этого класса. >Вообще поведение переменной будет несколько различаться в зависимости от того, была ли >она объявлена внутри функции, внутри класса или вне их. > >> >>Вопрос: конкретно, чем отличаются типы созданных указателей? > >Типы указателей не отличаются. Просто переменные будут размещены в разных областях памяти. > > >>И вдогону: в каких случаях требуется указывать ключевое слово <struct> >>при объявлнии указателей на структуры? > >struct нужно всегда указывать в C и не нужно в C++. Но >можно создать новый тип с помощью typedef и обойтись без ключевого >слова struct при объявлении указателей. >Насчет статика и структа спасиба... Дело в том, что обе переменные были объявлены в модуле, в глоальной области. И при попытке засунуть my1 в процедуру sleep_on я получал предупреждение компилятора. sleep_on(my1); Warning: в процедуру передан указатель несовместимого типа! А почему??? >> >>Также: >>try{ >>... >>throw ("MAMA!"); >>... >>}catch(const char *error){ >>... >>} >> >>Вопрос: почему команда throw приводит к завершению программы по сигналу SIGABRT??? >>А для чего тада были писаны каманды try и catch...? > >Не понял... Вроде должно работать: > >> cat testcatch.cc >#include <iostream.h> > >int main( void ) >{ > try { > throw("Help!"); > exit(1); > } catch(const char *error) { > cout << "Received: " ><< error << endl; > } > cout << "Finished\n"; > return 0; >} >> g++ -o testcatch testcatch.cc >> ./testcatch >Received: Help! >Finished А вот тут странно:))) У меня в С++ программе не работает:) Лана, проверю еще раз... Вопрос вдогонку: почему в линухе С++ так мало применяется???? Пытался найти примеры данной конструкции, а натыкался тока на чистый С++. Ладно ядро, но даже dosemulator и утилиты редхата - все на голом С!!! Он же в некоторых ситуациях приводит к пухлому коду!
- Некоторые тонкости С/С++, bug0r, 09:48 , 22-Сен-03 (3)
>Вопрос вдогонку: почему в линухе С++ так мало применяется???? >Пытался найти примеры данной конструкции, а натыкался тока на чистый С++. >Ладно ядро, но даже dosemulator и утилиты редхата - все на голом >С!!! >Он же в некоторых ситуациях приводит к пухлому коду! Наверно для совместимости. :-)
- Некоторые тонкости С/С++, aka50, 16:44 , 23-Сен-03 (4)
>>>Здрасти! >>>Вопрос такой: есть две строки >>>wait_queue_t *my1=NULL: >> >>Это стековый объект, значение my1 будет потеряно после выхода из области видимости >>данной переменной. Например при возврате из функции. >> >>>static struct wait_queue_t *my2=NULL; >> >>Переменная будет иметь старое значение после возврата в область видимости. >>Если же переменная объявлена как static внутри класса, то она становится общей >>для всех объектов этого класса. >>Вообще поведение переменной будет несколько различаться в зависимости от того, была ли >>она объявлена внутри функции, внутри класса или вне их. >> >>> >>>Вопрос: конкретно, чем отличаются типы созданных указателей? >> >>Типы указателей не отличаются. Просто переменные будут размещены в разных областях памяти. >> >> >>>И вдогону: в каких случаях требуется указывать ключевое слово <struct> >>>при объявлнии указателей на структуры? >> >>struct нужно всегда указывать в C и не нужно в C++. Но >>можно создать новый тип с помощью typedef и обойтись без ключевого >>слова struct при объявлении указателей. >> > >Насчет статика и структа спасиба... >Дело в том, что обе переменные были объявлены в модуле, в глоальной >области. >И при попытке засунуть my1 в процедуру sleep_on я получал предупреждение компилятора. > > >sleep_on(my1); >Warning: в процедуру передан указатель несовместимого типа! >А почему??? надо смотреть как sleep_on() объявлена > >>> >>>Также: >>>try{ >>>... >>>throw ("MAMA!"); >>>... >>>}catch(const char *error){ >>>... >>>} >>> >>>Вопрос: почему команда throw приводит к завершению программы по сигналу SIGABRT??? >>>А для чего тада были писаны каманды try и catch...? >> >>Не понял... Вроде должно работать: >> >>> cat testcatch.cc >>#include <iostream.h> >> >>int main( void ) >>{ >> try { >> throw("Help!"); >> exit(1); >> } catch(const char *error) { >> cout << "Received: " >><< error << endl; >> } >> cout << "Finished\n"; >> return 0; >>} >>> g++ -o testcatch testcatch.cc >>> ./testcatch >>Received: Help! >>Finished > >А вот тут странно:))) У меня в С++ программе не работает:) >Лана, проверю еще раз... >Вопрос вдогонку: почему в линухе С++ так мало применяется???? >Пытался найти примеры данной конструкции, а натыкался тока на чистый С++. >Ладно ядро, но даже dosemulator и утилиты редхата - все на голом >С!!! >Он же в некоторых ситуациях приводит к пухлому коду! 1. На С пухлый код??? Может быть тексту и больше, но в бинаре обычно меньше получается... 2. Так принятно, потому что C++ требовательный язык, а С почти минимален, плюс к тому легко можно использовать код как в кернеле так и в юзерспейсе, а С++ в кернель не засунешь (конечно можно, но придется все отключить типа throw-catch и проч). 3. Исторически сложилось, что операционка пишется на С, так как бытует мнение, что С менее перегружен левым кодом, который генерит компилятор С++ (ну классы, перегруженные операторы, таблицы методов). Даже виндовз - и та на С написана. :) (я имею ввиду систему, а не MFC и прочую муть).
- Некоторые тонкости С/С++, Мартовский заец, 21:18 , 26-Сен-03 (5)
> cat testcatch.cc >#include <iostream.h> > >int main( void ) >{ > try { > throw("Help!"); > exit(1); > } catch(const char *error) { > cout << "Received: " ><< error << endl; > } > cout << "Finished\n"; > return 0; >} Понял!!! Вся фенька в объявлении "const char *error" !!! Если писать const - то все ОкОб! а если без const - то SIGABR :))) Вопрос: почему????
|