Форум программистов, компьютерный форум CyberForum.ru

Запрет одного преобразования - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
thick_int
Заблокирован
16.02.2012, 01:06     Запрет одного преобразования #1
Есть ли в Visual C++ 2010 какая-нибудь возможность указать компилятору, что всякое неявное преобразование от числового типа в тип bool является ошибкой?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2012, 01:06     Запрет одного преобразования
Посмотрите здесь:

преобразования в Си... C++
Функции преобразования C++
C++ MinGW запрет неявного преобразования типов
Преобразования типов C++
Конструктор преобразования C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
16.02.2012, 01:16     Запрет одного преобразования #2
thick_int, не думаю что есть такая возможность, не используйте bool вообще если есть проблемы с преобразованием к нему.

Добавлено через 33 секунды
Или это Вы хотите условия вроде
C++
1
2
3
int x=3;
if(x)
 ...
убрать? Так не получиться так.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.02.2012, 01:17     Запрет одного преобразования #3
изучай опции компилятора http://msdn.microsoft.com/en-us/library/19z1t1wy.aspx
в частности http://msdn.microsoft.com/en-us/library/thxezb7y.aspx
мб чего и найдешь но думаю вряд ли такой запрет есть
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 01:23     Запрет одного преобразования #4
thick_int, только ежели оборачивать типы в классы и задавать explicit конструктор. тогда не будет никаких неявных преобразований.
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
16.02.2012, 01:48     Запрет одного преобразования #5
интересна ситуация, в которой это может понадобиться... или просто перестраховка от излишеств программиста?
thick_int
Заблокирован
16.02.2012, 02:11  [ТС]     Запрет одного преобразования #6
Да это понадобиться может только дляя того чтобы не путать операции = и == в операторе if.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.02.2012, 02:19     Запрет одного преобразования #7
Цитата Сообщение от thick_int Посмотреть сообщение
Да это понадобиться может только дляя того чтобы не путать операции = и == в операторе if.
используй обратную нотацию
C++
1
if (5 == i)
C
1
if (NULL == (file = fopen(...)))
thick_int
Заблокирован
16.02.2012, 03:49  [ТС]     Запрет одного преобразования #8
Нет, ну это известный прием.
Но он не ссрабатывает, когда нужно сравнить значение двух переменных.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.02.2012, 07:45     Запрет одного преобразования #9
thick_int, используйте стандартные функторы отношений:
C++
1
2
if (std::less<int>()(a, b))
    std::cout << "a < b" << std::endl;
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
16.02.2012, 08:31     Запрет одного преобразования #10
silent_1991, у С++ и так с читаемостью не очень, а ты предлагаешь такие решения

thick_int, насчет "покурить опции компилятора" уже посоветовали. Например для gcc получить желаемое поведение для кода:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int a = 3;
    int b = 4;
 
    if(a = b)
    puts("WHAT?");
    
    exit(0);
}
можно с помощью флага -Werror=parentheses (здесь мы получим ошибку компиляции). Скорее всего, и для cl.exe есть подобный флаг
silent_1991
16.02.2012, 09:21
  #11

Не по теме:

Nameless One, ну так какой вопрос))) А то сегодня мы запретили присваивание в условии, а завтра удаляем невалидный указатель.
Если человек взялся писать на плюсах - он должен быть готов возможности прострелить себе ногу на каждом шагу. Надо, чтобы за всем небезопасным следил компилятор - его выбор шарп или джава))

OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
16.02.2012, 14:16     Запрет одного преобразования #12
Ну можно поставить в опциях VS "Treat warnings as errors"
Bers
Заблокирован
16.02.2012, 14:59     Запрет одного преобразования #13
Цитата Сообщение от thick_int Посмотреть сообщение
Есть ли в Visual C++ 2010 какая-нибудь возможность указать компилятору, что всякое неявное преобразование от числового типа в тип bool является ошибкой?
Студия кажет варнинги, если внутри условия встретит =, вместо ==.
Так же, в студии есть возможность приравнять варнинг к ошибке.

/we n
Treats the specific compiler warning as an error where n is a compiler warning.
For example, /we4326 flags warning number C4326 as an error.

Можно попросить компилятор определенные предупреждения расценивать как ошибку.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
16.02.2012, 15:02     Запрет одного преобразования #14
Гмм. А если в каком-то месте программы это не ошибка?
Bers
Заблокирован
16.02.2012, 15:06     Запрет одного преобразования #15
Цитата Сообщение от CheshireCat Посмотреть сообщение
Гмм. А если в каком-то месте программы это не ошибка?
Для какого то особого места варнинг можно "временно отключить" , после прохождения этого места "снова включить"


http://msdn.microsoft.com/en-us/libr...(v=vs.71).aspx
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
16.02.2012, 15:12     Запрет одного преобразования #16
Ну, в общем, это-то понятно.....
Непонятно другое: зачем вообще это понадобилось ТС ? Подобное преобразование входит в Standard conversions наряду с другими. Если же ТС хочет заведомо обезопасить себя от кривых ручек - добро пожаловать в более безопасный язык - C#, например. Который как раз и разрабатывался соответствующим образом. Нет?
Bers
Заблокирован
16.02.2012, 15:25     Запрет одного преобразования #17
Цитата Сообщение от CheshireCat Посмотреть сообщение
...обезопасить себя от кривых ручек - добро пожаловать в более безопасный язык - C#
Если хочется писать код на более мощном и быстром языке, и при этом есть возможность "бесплатно" обезопасить код, почему бы этим не воспользоваться?

Лично я вообще никакие дополнительные ключики компилятору не ставлю. Однако не пропускаю ни одного варнинга. Варнингов быть не должно в принципе.

Цитата Сообщение от CheshireCat Посмотреть сообщение
А если в каком-то месте программы это не ошибка?
Даже если сие - задумка автора а все одно - суть мина замедленного действия, и тормоз для сопровождения, а посему не быть ей в коде.

А тот кто с этим не согласный, пусть приведёт реальный пример, где конструкцию вида: if(a=b) {...}
нельзя преобразовать к виду: a=b; if(a!=0) {...}

Или идет нафег.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
16.02.2012, 15:30     Запрет одного преобразования #18
Цитата Сообщение от CheshireCat Посмотреть сообщение
Гмм. А если в каком-то месте программы это не ошибка?
gcc обычно пропускает, если выражение взято в скобки, может и у VS аналогичное поведение предусмотрено:
C++
1
if ((x = y))
thick_int
Заблокирован
16.02.2012, 15:46  [ТС]     Запрет одного преобразования #19
Цитата Сообщение от silent_1991 Посмотреть сообщение
Надо, чтобы за всем небезопасным следил компилятор - его выбор шарп
Шарп просто убивает вот таким косяком.
C#
1
2
short a = 2, b =3, c;
c = (short)(a + b);
А так просто уже ругается
C#
1
c = a + b;
Уж лучше Visual Basic тогда. Кстати, прощу прощения, что вопрос несколько не по теме. А почему Шарп, ну во всяком случае в России, как то более востребован по сравнению с Visual Basic. Вроде Basic постарее и поофиснее на предмет макросов в MS Officee, ан нет все же Шарп повостребованнее. Вообще кстати такое ощущение, что Шарп - самый востребованный язык. Откуда это? Непонятно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2012, 16:03     Запрет одного преобразования
Еще ссылки по теме:

Реализовать двусвязный список. В разных узлах одного списка может быть любой объект одного из допустимых типов (своих знаний не хватает) C++
C++ спецификаторы преобразования
C++ Преобразования текста

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
16.02.2012, 16:03     Запрет одного преобразования #20
Цитата Сообщение от thick_int Посмотреть сообщение
Откуда это?
Это - коварство и хитрость корпорации Зла.
Yandex
Объявления
16.02.2012, 16:03     Запрет одного преобразования
Ответ Создать тему
Опции темы

Текущее время: 16:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru