?

Log in

No account? Create an account
Нужна скорая помощь по C. Бо меня на гугле забанили заклинило. Есть… - Берлога [entries|archive|friends|userinfo]
Villain-Marais

[ website | Берлога ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

[Dec. 14th, 2009|06:11 pm]
Villain-Marais
[Current Music | Los_Del_Rio-Macarena]

Нужна скорая помощь по C. Бо меня на гугле забанили заклинило.

Есть два типа enum. Кое-где в программе переменные одного из типов сравниваются с константами другого. Компилятор жрет без проблем, видимо, потому что считает их int, не заморачиваясь. А мне надо отловить эти ошибочные сравнения на этапе компиляции. Что бы подкрутить? Как-то уломать компилятор делать strict проверки типов?

Upd: Компилятор - под Visual Studio.
LinkReply

Comments:
[User Picture]From: trurle
2009-12-14 04:26 pm (UTC)
gcc -Wenum-compare?
(Reply) (Thread)
[User Picture]From: henic
2009-12-14 04:30 pm (UTC)
Сорри, забыл сказать. Visual studio. :(
(Reply) (Parent) (Thread)
[User Picture]From: mopexod
2009-12-14 04:39 pm (UTC)
Думаю, что по-простому - никак, к strict проверкам типов это отношения не имеет.
Но с интересом почитаю ответы, а вдруг и прада - можно? :)
(Reply) (Thread)
[User Picture]From: henic
2009-12-14 04:42 pm (UTC)
Похоже, что легче будет проверить двести вхождений вручную. :(
(Reply) (Parent) (Thread)
[User Picture]From: ygam
2009-12-14 04:42 pm (UTC)
Что-то навроде этого:

#ifdef DEBUG

class Enum1
{
private:
int _v;
Enum1(int v) : _v(v) {}
public:
static Enum1 V1() { Enum1 e(0); return e; }
static Enum1 V2() { Enum1 e(1); return e; }
static bool operator == (const Enum1 &other) { return _v == other._v; }
};
#else

enum Enum1 {V1,V2};

#endif
(Reply) (Thread)
[User Picture]From: henic
2009-12-14 04:43 pm (UTC)
Cпасибо!
(Reply) (Parent) (Thread)
[User Picture]From: ygam
2009-12-14 04:44 pm (UTC)
Не совсем; 3 года не программировал на сиплюсплюсе.

Внутри определения класса:

static Enum1 V1;
static Enum1 V2;

Вне определения класса:

Enum1 Enum1::V1 (0);
Enum1 Enum1::V2 (1);

Edited at 2009-12-14 04:44 pm (UTC)
(Reply) (Parent) (Thread)
[User Picture]From: henic
2009-12-14 04:45 pm (UTC)
Спасибо еще раз. Я понял идею, дальше уже напильником обработаю, если что-то не будет работать.
(Reply) (Parent) (Thread)
[User Picture]From: trurle
2009-12-14 04:53 pm (UTC)
Ета, у Вас Си или Си-два креста?
(Reply) (Parent) (Thread)
[User Picture]From: henic
2009-12-14 05:37 pm (UTC)
Два плюса. 2005.
(Reply) (Parent) (Thread) (Expand)
[User Picture]From: mopexod
2009-12-14 06:05 pm (UTC)
Я прямо сейчас не могу проверить, но, кажется, Enum1::V1 для настоящих enums не валидно в С++. То есть обращение к V1, V2 будет разным в дебаг и релиз.
(Reply) (Parent) (Thread)
[User Picture]From: ygam
2009-12-14 06:28 pm (UTC)
Значит, просто Enum1 V1(0), и конструктор должен быть публичным.
(Reply) (Parent) (Thread)
[User Picture]From: gct
2009-12-14 07:42 pm (UTC)
не понимаю в этой теме :(
(Reply) (Thread)
[User Picture]From: henic
2009-12-14 07:50 pm (UTC)
Ничего страшного. :) Примерный ход подсказали, завтра разберусь.
(Reply) (Parent) (Thread)
From: vicnick
2009-12-14 09:39 pm (UTC)
// Проверял на Visual Studio 2008
enum Enum1
{
E1 = 1
};
enum Enum2
{
E2 = 2
};
void test()
{
Enum1 e1;
e1 = E1; // ok
e1 = (Enum1)E2; // ok
e1 = E2; // error C2440: '=' : cannot convert from 'Enum2' to 'Enum1'
}
// Проверить в среде Visual Studio 2005 не могу.
(Reply) (Thread)
[User Picture]From: mopexod
2009-12-15 01:09 am (UTC)
Не присваивания, а сравнения. Присваивание - не вопрос :)
(Reply) (Parent) (Thread)
[User Picture]From: henic
2009-12-15 06:19 am (UTC)
Спасибо. Вообще странно, потому что не вижу, чем отличается от используемого мной.
(Reply) (Parent) (Thread)
[User Picture]From: ozlev
2009-12-15 06:49 am (UTC)
А почему тебя в Гугле забанили? Требую толкования идиомы со ссылками...
(Reply) (Thread)
[User Picture]From: henic
2009-12-15 06:54 am (UTC)
Откуда пришла фраза - не знаю. Я имел в виду, что поиск в течение пятнадцати минут гуглем ничего не дал: чтобы найти, надо точно знать, что ищешь. А тут надо по форумам шастать.
(Reply) (Parent) (Thread)
[User Picture]From: ozlev
2009-12-15 07:03 am (UTC)
Разленился...
Я тут три дня форумы шерстил в поисках магической формулы...
(Reply) (Parent) (Thread)
[User Picture]From: henic
2009-12-15 07:04 am (UTC)
Нет смысла. Даже двести вхождений - проще вручную глянуть.
(Reply) (Parent) (Thread)
[User Picture]From: yba
2009-12-16 11:42 am (UTC)
если еще не сделал такой вариант работает:
enum    E1 
{ 
    V1, 
    V2 
}; 

enum    E2 
{ 
    V3, 
    V4 
}; 

template    <typename    T1,    typename    T2>
bool    operator==(T1 t1,T2 t2)
{ 
    float a = "asd"; 
} 

template    <typename    T1,    typename    T2>
bool    operator!=(T1 t1,T2 t2)
{ 
    float a = "asd"; 
} 

int    main() 
{ 
    E1    e1=V1; 
    E2    e2=V3; 
     
    if    (e1==V2) 
        std::cout<<"+\n";
    if    (e1==V3) 
        std::cout<<"-\n"; 
    if    (e1!=e2) 
        std::cout<<"-\n"; 
    if    (e2==V4) 
        std::cout<<"+\n";
    if    (e2!=V2) 
        std::cout<<"-\n"; 
    if    (e2==e1) 
        std::cout<<"-\n"; 
         
    return 0; 
} 


в строках где разнотипное сравнение VS2003 дает ошибку типа
main.cpp(235) : error C2440: 'initializing' : cannot convert from 'const char [4]' to 'float'
There is no context in which this conversion is possible
main.cpp(251) : see reference to function template instantiation 'bool operator !=<E2,E1>(T1,T2)' being compiled
with
[
T1=E2,
T2=E1
]

болдовая строка - как раз место сравнения
Если же разнотипных сравнений уже нет - все будет компилироваться без ошибок

Edited at 2009-12-16 11:44 am (UTC)
(Reply) (Thread)
[User Picture]From: henic
2009-12-16 11:50 am (UTC)
Спасибо!
(Reply) (Parent) (Thread)
[User Picture]From: henic
2009-12-16 04:45 pm (UTC)
Оппа... Какой паровоз других не совсем корректных сравнений эта штука мне нашла. :) Большое человеческое спасибо. ))))
(Reply) (Parent) (Thread)
From: vicnick
2009-12-16 09:35 pm (UTC)
Очень красивое решение :)
(Reply) (Parent) (Thread)
(Deleted comment)
[User Picture]From: henic
2010-03-03 09:38 pm (UTC)
А нехер! :)
За двадцать лет ни разу не случилось работать с wchar.
(Reply) (Parent) (Thread)
[User Picture]From: yba
2010-03-04 10:43 am (UTC)
Ну можно еще специализаций операторов добавить, чтобы нужные типы оно все-таки сравнивало. Но в принципе такая штука просто показывает места разнотипных сравнений, а легитимны ли они - решать уже программисту
(Reply) (Parent) (Thread)
(Deleted comment)
[User Picture]From: henic
2010-03-04 01:10 pm (UTC)
да и так неплохо получилось...
(Reply) (Parent) (Thread)