2010-08-10 18 views
5

Olası Çoğalt:
or is not valid C++ : why does this code compile ?"ve"/"veya" yerine "&&"/"||" C++ kodunda - derleyici özelliği veya programcının hatası?

Merhaba.

bool operator != (Point p1, Point p2) 
{ 
    return p1.X != p2.X or p1.Y != p2.Y or p1.Z != p2.Z; 
}; 

bildiğim kadarıyla söyleyebilirim, or hatta makro olarak, herhangi bir yerde ilan edilmez:

Geçenlerde başkası tarafından yazılmış olağandışı C++ kodu karşılaştık. Kodda ayrıca birkaç tane and s vardır. Sonuç olarak, proje VC2008 Express'te oluşturulmuyor. Bana kodu veren kişi, yazarın mingw derleyicisini kullandığını söyledi.

Soru: Bu standart olmayan bir derleyici özelliğidir (bundan şüpheliyim), bu daha yeni C++ standardının bir parçası (C++ 0x izlemiyordum) veya bu bir programcının problemi mi? eğer adam paskaldan geçerse, alışkanlık nedeniyle &&/|| yerine ve/veya daha "okunabilir" olduğunu düşünüyordu.

cevap

15

Bu, C++ standart bir parçasıdır:

Burada süreç içinde vidalı olabilir standart, ekstrakte edilen bir listesi aşağıda verilmiştir. Ne yazık ki, Visual C++, varsayılan olarak o kısmı izin vermez ve Microsoft’s answer to a bug report is “won’t fix, since nobody uses this.”

komut satırı seçeneği /Za ile yapılabilir derleyici, Visual C++, you need to disable the Microsoft language extensions düzeltmek için.

Alternatif olarak, bu anahtar kelimeleri uyumlu olmayan derleyiciler için tanımlayan <ciso646> başlığını eklemek basit bir çözümdür.

(bu tarzı tercih birkaç kişiden biriyim ve benim kod taşınabilir hale getirmek için yerine temiz, ingilizce kelimelerin ASCII çorba kullanmak zorluyor için Microsoft'ta biraz kızgınım.)

+1

Ben de bu stili tercih ederim, özellikle '' '' den daha okunaklı olan '' 'değil. –

+4

Sorun şu ki, bunu görmek için çok yaygın olmayan, herhangi bir deneyimsiz programcı açılırsa, WTF'ye gider ve stackoverflow üzerine bir soru gönderir. Yani aklımda bu yapıları kullanmak kötü bir fikir çünkü bu kodları korumak zorlaştırıyorlar (aslında ne demek istediklerini araştırmak zorundasınız). –

+0

@Martin İnsanların yerine digraph kullandığını mı tercih edersiniz? Bu isimler klavyenin gerekli sembollere sahip olmayan veya en azından asıl amaç olan kişilerin kullanması için tasarlanmıştır. –

4

Aslında şu anki C++ Standard'ın bir parçasıdır (bkz. Bölüm 2.5/1), ancak bunları uygulamanızda etkinleştirmek için bir şeyler yapmanız gerekebilir.

and && 
and_eq &= 
bitor | 
or || 
or_eq |= 
xor_eq ^= 
xor^
not ! 
compl ~ 
not_eq != 
bitand & 
İlgili konular