?

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: 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)