Pewne twierdzenia w moim kodzie zaczęły działać dziwnie, a ja zastanawiałem się, czy wcześniej ktoś miał podobną sytuację. Krótki fragment kodu, takich jak:Dziwne potwierdzenie błędów logicznych i boolowych
#include <cassert>
class A{
protected:
bool isM, isN;
public:
void someFunction();
};
A::someFunction(){
assert (this->isM && this->isN);
...
}
produkuje assertion failed
wynik. Z drugiej strony, po nieznacznie zmianie kodu:
A::someFunction(){
assert(this->isM);
assert(this->isN);
...
}
asercje przechodzą bez problemu, a funkcja kończy się normalnie. Wykańczanie funkcji jest zwykle oczekiwaną funkcjonalnością, ponieważ zmienne bool
są ustawiane przed faktycznym wywołaniem na someFunction()
.
Jako dodatkowe pytanie, czy istnieje lepszy sposób robienia asercji w C++? Dorastałem na C i nadal używam twierdzeń w stylu C. Właśnie podrapałem się w Google, ale nic nie wskazywało na to, że jest coś nowego.
Och, i jeśli to konieczne, mogę podać więcej kontekstu dla klasy i zmiennych, jeśli to nie wystarczy, aby ktokolwiek mógł rozpoznać problematyczną sytuację. Zmienne bool
są w rzeczywistości ustawione w instancji podklasy, a someFunction
jest jedną z rzadkich funkcjonalności zaimplementowanych w interfejsie class A
, ale ponieważ komplikuje to pytanie, będę je edytować bardziej szczegółowo, jeśli społeczność uzna to za istotne.
masz na myśli, że zmienne 'bool' są ustawione przed wywołaniem' someFunction() '? – juanchopanza
Czy ustawione są bool? – dexametason
C++ 11 wprowadza 'static_assert', który jest asercją czasu kompilacji. Myślę, że jest on również dostępny w wersji boost dla poprzednich wersji C++. – RedX