2016-07-21 13 views
5

Próbujesz rozwiązać ten problem: C++ How can I prevent my team developers from using integer version of abs by mistake? za pomocą makra, aby funkcja abs przestała być użyteczna.Nie można ustawić standardowej funkcji zabronionej przy użyciu instrukcji preprocesora?

Jeśli skompiluję kod zawierający myabs(3); z opcją g ++ -Dmyabs=abs, kompilacja (myabs zostanie zastąpiona przez abs), dobra.

Teraz, jeśli mogę skompilować kod zawierający abs(3); zg ++ opcję -Dabs=forbidden kompiluje zbyt ... dlaczego nie podają, że forbidden jest nieznany? Wygląda na to, że abs nie jest zastępowane przez forbidden podczas wstępnego przetwarzania ... dlaczego?

Odpowiedz

1

Wygląda na to, że abs nie jest zastępowany przez zabronione podczas wstępnego przetwarzania ... dlaczego?

co najmniej normy nagłówki biblioteczne, że zastosowanie (libstdC++), które określają ::abs, definiowanie makra:

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

Twoje nagłówki mogła robić to samo. Biorąc pod uwagę takie nieokreśloności, nie można zakazać takiej funkcji przy użyciu makra preprocesora.

+0

Jeśli jest on strzeżony przez strażników, możesz wymusić włączenie go za pomocą argumentu -include cmath kompilatora, a następnie zdefiniować makro abs (untried) – matt

+0

Dobra odpowiedź: 'abs' jest zamieniane na' zabronione' przed dodaniem 'matematyki', nie po, więc trzeba zrobić '#undef abs' – jpo38

Powiązane problemy