URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2089
[ Назад ]

Исходное сообщение
"Некоторые тонкости С/С++"

Отправлено Мартовский заец , 18-Сен-03 22:23 
Здрасти!
Вопрос такой: есть две строки
wait_queue_t *my1=NULL:
static struct wait_queue_t *my2=NULL;

Вопрос: конкретно, чем отличаются типы созданных указателей?
И вдогону: в каких случаях требуется указывать ключевое слово <struct>
при объявлнии указателей на структуры?

Также:
try{
...
throw ("MAMA!");
...
}catch(const char *error){
...
}

Вопрос: почему команда throw приводит к завершению программы по сигналу SIGABRT???
А для чего тада были писаны каманды try и catch...?


Содержание

Сообщения в этом обсуждении
"Некоторые тонкости С/С++"
Отправлено bogerm , 19-Сен-03 05:16 
>Здрасти!
>Вопрос такой: есть две строки
>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



"Некоторые тонкости С/С++"
Отправлено Мартовский заец , 20-Сен-03 12:46 
>>Здрасти!
>>Вопрос такой: есть две строки
>>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 , 22-Сен-03 09:48 
>Вопрос вдогонку: почему в линухе С++ так мало применяется????
>Пытался найти примеры данной конструкции, а натыкался тока на чистый С++.
>Ладно ядро, но даже dosemulator и утилиты редхата - все на голом
>С!!!
>Он же в некоторых ситуациях приводит к пухлому коду!


Наверно для совместимости.  :-)


"Некоторые тонкости С/С++"
Отправлено aka50 , 23-Сен-03 16:44 
>>>Здрасти!
>>>Вопрос такой: есть две строки
>>>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 и прочую муть).


"Некоторые тонкости С/С++"
Отправлено Мартовский заец , 26-Сен-03 21:18 

> 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 :)))
Вопрос: почему????