Здрасти!
Вопрос такой: есть две строки
wait_queue_t *my1=NULL:
static struct wait_queue_t *my2=NULL;Вопрос: конкретно, чем отличаются типы созданных указателей?
И вдогону: в каких случаях требуется указывать ключевое слово <struct>
при объявлнии указателей на структуры?Также:
try{
...
throw ("MAMA!");
...
}catch(const char *error){
...
}Вопрос: почему команда throw приводит к завершению программы по сигналу SIGABRT???
А для чего тада были писаны каманды try и catch...?
>Здрасти!
>Вопрос такой: есть две строки
>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
>>Здрасти!
>>Вопрос такой: есть две строки
>>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 и утилиты редхата - все на голом С!!!
Он же в некоторых ситуациях приводит к пухлому коду!
>Вопрос вдогонку: почему в линухе С++ так мало применяется????
>Пытался найти примеры данной конструкции, а натыкался тока на чистый С++.
>Ладно ядро, но даже dosemulator и утилиты редхата - все на голом
>С!!!
>Он же в некоторых ситуациях приводит к пухлому коду!
Наверно для совместимости. :-)
>>>Здрасти!
>>>Вопрос такой: есть две строки
>>>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 и прочую муть).
> 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 :)))
Вопрос: почему????