The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Некоторые тонкости С/С++"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Некоторые тонкости С/С++"
Сообщение от Мартовский заец emailИскать по авторуВ закладки on 18-Сен-03, 22:23  (MSK)
Здрасти!
Вопрос такой: есть две строки
wait_queue_t *my1=NULL:
static struct wait_queue_t *my2=NULL;

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

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Некоторые тонкости С/С++"
Сообщение от bogerm emailИскать по авторуВ закладки on 19-Сен-03, 05:16  (MSK)
>Здрасти!
>Вопрос такой: есть две строки
>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


  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Некоторые тонкости С/С++"
Сообщение от Мартовский заец emailИскать по авторуВ закладки on 20-Сен-03, 12:46  (MSK)
>>Здрасти!
>>Вопрос такой: есть две строки
>>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 и утилиты редхата - все на голом С!!!
Он же в некоторых ситуациях приводит к пухлому коду!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Некоторые тонкости С/С++"
Сообщение от bug0r emailИскать по авторуВ закладки on 22-Сен-03, 09:48  (MSK)
>Вопрос вдогонку: почему в линухе С++ так мало применяется????
>Пытался найти примеры данной конструкции, а натыкался тока на чистый С++.
>Ладно ядро, но даже dosemulator и утилиты редхата - все на голом
>С!!!
>Он же в некоторых ситуациях приводит к пухлому коду!


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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Некоторые тонкости С/С++"
Сообщение от Мартовский заец emailИскать по авторуВ закладки on 26-Сен-03, 21:18  (MSK)

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру