Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неиспользуемые аргументы функции 
:(
    Опции темы
0x07L
Дата 24.7.2006, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 1
Всего: 5



Попробовал тут в одном проекте поставить четвертый warning level и обнаружил, что Visual Studio 2005 теперь выдает предупреждение о неиспользумых параметрах функции. Есть, например,
Код

int APIENTRY _tWinMain (HISTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR CmdLine, int CmdShow)
{
     return static_cast<int>(DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), 0, DialogProc)));
}

Здесь я не использую hPrevInstance, CmdLine, CmdShow. На что повлияют следующие изменения:
Код

int APIENTRY _tWinMain (HISTANCE hInstance, HINSTANCE, LPTSTR, int)
{
     return static_cast<int>(DialogBox( . . . ));
}

кроме как на исчезновение предупреждений и лишних имен в области видимости? Влияет ли это, к примеру, на выделение памяти? Если нет, то зачем предупреждения? 
PM MAIL   Вверх
sergejzr
Дата 24.7.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Предупреждения обычно для того, чтобы обратмть твоё внимание. smile На самом деле , чем меньше аргументов, тем код легче читается. 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Earnest
Дата 24.7.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



На выделение памяти и поведение программы, уже конечно, не повлияет.
А разве раньше при 4-м уровне не было таких предупреждений? По-моему, и в 6-й студии были.
Предупреждения пытаются предугадать часто совершаемые ошибки... Не знаю, является ли частой ошибкой "объявил переменную, а использовать - забыл"
4-й уровень -  сверх-параноидальный, я использую только третий.

 

Это сообщение отредактировал(а) Earnest - 24.7.2006, 13:58


--------------------
...
PM   Вверх
0x07L
Дата 24.7.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 1
Всего: 5



Извините, я немного не так выразился. Говоря "теперь", я имел в виду "при переходе с третьего (установленного по умолчанию) на четвертый уровень".
Цитата(sergej.z @  24.7.2006,  12:11 Найти цитируемый пост)
Предупреждения обычно для того, чтобы обратмть твоё внимание

Ну а зачем обращать мое внимание на это? Тем более, некоторые люди (например, я) не любят даже предупреждения и стремятся, чтобы их не было. Тогда для этого мне придется делать так:
Код

int APIENTRY _tWinMain (HISTANCE hInstance, HINSTANCE /* hPrevInstance */, LPTSTR /* CmdLine */, int /* CmdShow */)
{
     return static_cast<int>(DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), 0, DialogProc)));
}

Теперь если понадобится использовать эти переменные, придется снимать комментарии - лишнее время, а пользы (в смысле устранения ошибок в программе) никакой. Можно, конечно, оставлять третий уровень и не волноваться, но третий, к сожалению, не определяет переменные, которые объявляются, но не используются, а вот это уже плохо.

PS Можно, правда, использовать
Код

#pragma warning(disable:Cxxxx)


Добавлено @ 14:04 
Цитата(Earnest @  24.7.2006,  14:45 Найти цитируемый пост)
4-й уровень -  сверх-параноидальный

В VS2005 в свойствах проекта есть еще пункт "Treat Warnings As Errors". Вот он уж действительно сверх-параноидальный.
 

Это сообщение отредактировал(а) 0x07L - 24.7.2006, 13:58
PM MAIL   Вверх
Earnest
Дата 24.7.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Сложно сказать, какой логикой руководствовались MS разработчики, да и не суть. Если тебе предупреждение мешает, отключи его прагмой, действительно. Если мешает всегда и везде - поставь прагму в stdafx.h (или другой всегда включаемый заголовок).
В MFC еще применяют такой метод: объявлен макрос UNUSED:
Код

#ifdef _DEBUG
#define UNUSED(x)
#else
#define UNUSED(x) x
#endif
#define UNUSED_ALWAYS(x) x

И потом, в теле функции добавляют предложения UNUSED(xxx). Например:
Код

BOOL CStatusBar::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
    if (message != WM_DRAWITEM)
        return CWnd::OnChildNotify(message, wParam, lParam, pResult);

    ASSERT(pResult == NULL);
    UNUSED(pResult); // unused in release builds
    DrawItem((LPDRAWITEMSTRUCT)lParam);
    return TRUE;
}

Это генерирует псевдо-использование переменной, и компилятор затыкается.
Довольно громоздко, хотя явно выражает намерения: "здесь играть, здесь не играть, здесь рыбу ели..." 


--------------------
...
PM   Вверх
sergejzr
Дата 24.7.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Цитата(Earnest @  24.7.2006,  12:13 Найти цитируемый пост)
Сложно сказать, какой логикой руководствовались MS разработчики, да и не суть.

Это не только у МС такое есть smile

Мне например очень удобно. На этапе проектирования бывает снабдишь функции кучей аргументов, а в дальнейшем может и не используешь. С помощью таких варнингов сразу эти места находишь. Другое дело, что когда "чужими" функциями пользуешься это немного раздражает, но там и выключается. 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
0x07L
Дата 24.7.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 1
Всего: 5



Цитата(sergej.z @  24.7.2006,  15:16 Найти цитируемый пост)
С помощью таких варнингов сразу эти места находишь.

Да, об этом я не подумал.

Earnest, спасибо за UNUSED. Буду иметь в виду. Но, наверное, не буду использовать. Не очень он мне нравится, обойдусь пока комментариями. 
PM MAIL   Вверх
Earnest
Дата 24.7.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Пожалуйста, мне и самой не нравиться  smile 
Просто как пример. 
Я предпочитаю проверять все ворнинги (иногда что-нибудь компилятор да находит), и отключать (локальными прагмами или явным преобразованием типа) те места, где "так надо".
Плюс пишу комментарии, ради чего прагма (чтобы потом, если код изменится, убрать).  

Но по-моему, в данном случае (неиспользуемые параметры), проще их убрать (оставить только типы). Трудно потом добавить, что ли, если понадобятся? А комментарии /*... */ - жуткая пакость: если надо большой кусок кода временно закомментировать - обругаешься. 

Это сообщение отредактировал(а) Earnest - 24.7.2006, 17:34


--------------------
...
PM   Вверх
Coocky
Дата 24.7.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Маньяки smile  


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
0x07L
Дата 24.7.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 1
Всего: 5



Имена переменных я не удаляю затем, чтобы потом, в случае необходимости, можно было вспомнить, что передается конкретным параметром. Например, вот
Код

void OnKeyUp (UINT, UINT, UINT);

Для того чтобы понять, какой UINT что из себя представляет, придется смотреть MSDN. А так
Код

void OnKeyUp (UINT /* VirtualCode */, UINT /* RepeatCount */, UINT /* Flags */);

все сразу ясно.

Кстати, почему комментарии /* */ не могут быть вложенными? Доводы типа "потому что это стандарт С" не принимаются  smile  
PM MAIL   Вверх
Earnest
Дата 25.7.2006, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Почему не могут, могут (кажется, у старого досовского борланда была такая опция). Но у Visual C -вроде нет. Наверное, есть какие-то проблемы с лексическим разбором. У С++ их и так полно, так что зачем еще усложнять из-за нестандартной ерунды. 
Для меня довод "придется смотреть в MSDN" смешно звучит: чтобы найти параметры обработчика в MSDN требуется ненамного больше времени, чем на стирание комментариев  smile.
Тем более, никто не мешает оставить имена параметров в объявлении функции.  


--------------------
...
PM   Вверх
0x07L
Дата 25.7.2006, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 1
Всего: 5



Да, точно.

Добавлено @ 07:20 
У Кернигана-Ритчи написано "Комментарии не вкладываются друг в друга". Не могу. к сожалению, сказать, какого года книга. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0690 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.