2016-07-21 29 views
5

Bu sorunu gidermeye çalışırken: C++ How can I prevent my team developers from using integer version of abs by mistake?abs işlevini kullanmak için makroyu kullanarak artık kullanamazsınız.Bir önişlemci deyimi kullanılarak standart bir işlev yasaklanamaz mı?

I g myabs(3); ihtiva eden bir kod ++ seçenek derler -Dmyabs=abs (myabsabs ile ikame edilmiştir) derlemek, iyi.

Şimdi abs(3); g ++ seçeneği -Dabs=forbidden içeren bir kod derlediysem de derler ... neden bu forbidden'un neden bildirildiğini bildirmiyor? Ön işleme sırasında abs'un forbidden ile değiştirilmediği görünüyor ... neden?

cevap

1

Ön işleme sırasında abs'in yasaklı yerine geçmediği anlaşılıyor ... neden? Ben ::abs define (libstdC++) kullanan

En azından standart kütüphane başlıkları, tanımsız makro:

// Get rid of those macros defined in <math.h> in lieu of real functions. 
#undef abs 
#undef div 
// ... 

Sizin başlıkları aynı şeyi yapıyor olabilir. Bu tür bir tanımsızlık göz önüne alındığında, bu işlemin bir ön işlemci makrosu kullanılarak yasaklanması gerçekten imkansızdır.

+0

Muhafızları içerecek şekilde koruma altına alınmışsa, içerisine -include cmath derleyici argümanı ile dahil edilmesini zorlayabilir, sonra abs makrosunu tanımlayın (denenmemiş) – matt

+0

İyi cevap: 'abs' i içermeden önce' abs' yerine 'yasak 'ile değiştirilir. sonra değil, yani "#undef abs" yapmalı – jpo38

İlgili konular