2012-04-03 3 views
6

Einige Behauptungen in meinem Code begannen gerade seltsam zu handeln, und ich fragte mich, ob jemand eine ähnliche Situation zuvor hatte. Ein kurzer Code-Schnipsel wie:Strange assert fail on logische und bool Variablen

#include <cassert> 

class A{ 
    protected: 
     bool isM, isN; 

    public: 
     void someFunction(); 
}; 

A::someFunction(){ 
    assert (this->isM && this->isN); 

    ... 
} 

erzeugt ein assertion failed Ergebnis. Auf der anderen Seite, nach dem Ändern des Codes nur leicht:

die Zusicherungen bestehen ohne Problem und Funktion endet normal. Funktionsende ist normalerweise die erwartete Funktionalität, da die Variablen bool vor dem eigentlichen Aufruf an someFunction() gesetzt werden.

Als eine zusätzliche Frage gibt es eine bessere Möglichkeit Assertions in C++ zu tun? Ich bin auf C aufgewachsen und benutze immer noch die C-Style Assertions. Ich habe gerade Google Oberfläche auf diesem gekratzt, aber nichts gefunden, das andeutet, dass es etwas neues gibt.

Oh, und wenn nötig, kann ich mehr Kontext für die Klasse und die Variablen zur Verfügung stellen, wenn dies nicht ausreicht, um die problematische Situation zu erkennen. Die bool Variablen werden tatsächlich in einer Instanz einer Unterklasse gesetzt, während someFunction eine der wenigen Funktionalitäten ist, die in der class A Schnittstelle implementiert sind, aber da dies die Frage komplizierter macht, werde ich sie nur ausführlicher bearbeiten, wenn die Community dies für relevant hält.

+0

meinst du die 'bool' Variablen werden vor dem Aufruf von' someFunction() 'gesetzt? – juanchopanza

+0

Sind Bools gesetzt oder nicht? – dexametason

+0

C++ 11 bringt 'static_assert', was eine Assertion zur Kompilierung ist. Ich denke, es ist auch auf Boost für frühere C++ - Versionen verfügbar. – RedX

Antwort

3

Die Booleans sind nicht initialisiert. Sie könnten irgendeinen Wert annehmen. Das Verhalten ist hier nicht definiert. Um das zu veranschaulichen, einen gcc 4.7 Snapshot auf Ubuntu 11.10:

#include <iostream> 

struct A { 
    bool a, b; 
}; 

int main() { 

    A a0; 
    std::cout << a0.a << ", " << a0.b << "\n"; 

    A a1; 
    std::cout << a1.a << ", " << a1.b << "\n"; 

} 

erzeugt diese Ausgabe:

121, 0 
244, 31 

oder wiederum ausgeführt wird,

192, 0 
244, 127 

oder mit -O3 Optimierung a Haufen Nullen.

+0

Was ist der Unterschied zwischen den ausgegebenen Snippets, die Sie dort einfügen? – penelope

+0

@penelope Ich habe das Programm gerade zweimal ausgeführt. – juanchopanza

+0

ah :) sie sind völlig gleich. Ich denke, das war irgendwie verwirrend – penelope