2010-08-16 6 views
6

Die vertrauliche Verwendung von Klassen in der Liste der Variablen ohne Argumente mit c-Stil ist eine häufige Fehlerquelle. Beispiel:Gibt es eine Möglichkeit, die Verwendung einer Klasse nach Wert in c-Stil Variablenargumentenliste zu verbieten?

class MyString { 
    public: 
    char *pChars; 
    int Length; 

    MyString(char *pChars) { 
     this->pChars = pChars; 
     Length = strlen(pChars); 
     } }; 

int main() { 
    MyString s1("Bla1"), s2("Bla2"); 
    printf("%s%s", s1, s2); // This does not but should give a compiler warning/error! 
    return 0; } 

Der printf gibt die Objekte s zwei erhält von Wert. Das bedeutet, dass alle ihre Mitglieder einfach kopiert werden. Sie werden jedoch als einfache Zeichenzeiger interpretiert. Das Ergebnis ist natürlich ein Laufzeitfehler.

ich bitten, dies für eine Lösung bin nicht, aber ich möchte etwas habe ich zu meiner Klasse hinzufügen könnte, so dass der Compiler mir darüber oder gibt einen Fehler warnt.

Bereits versucht, einen Kopierkonstruktor zu deklarieren, aber nicht zu implementieren. Aber es scheint, dass kein Kopierkonstruktor aufgerufen wird. :-(

Bitte nur im Titel auf die Frage zu beantworten, ich brauche keinen discusson, warum Sie nicht printf oder diese Variable Argumente Listen verwenden sollten -. Wissen, dass

Vielen Dank für Ihre Zeit

..
+1

Welchen Compiler benutzen Sie? – kennytm

+0

"Ich brauche keine Diskussion darüber, warum Sie printf oder diese Listen mit variablen Argumenten nicht verwenden sollten - wissen Sie das." - Was stimmt nicht mit printf? – alternative

+0

Ich benutze Visual C++ –

Antwort

11

Decent Compiler (wie gcc) prüfen, ob printf Argumente Formatbezeichner in Format-String übereinstimmen.

Nur nicht vergessen, -Wformat oder -Wall Befehlszeilenoption hinzuzufügen.

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

+4

Nun, vielleicht Visual C++ ist kein Abstieg Compiler? –

+2

@kaptnole sie auf den Anstand verschoben, zumindest in Bezug auf das Problem, das Sie erleben :) http://connect.microsoft.com/VisualStudio/feedback/details/98899/compiler-should-warn-about-passing-objects- von Nicht-Pod-Typen-zu-den-Ellipsen. Ich weiß, dass Sie dies nicht hören möchten, aber printf nicht verwenden, sehen Sie die Ratschläge hier http://stackoverflow.com/questions/2017489/should-i-use-printf-in-my-c-code – celavek

+0

@celavek Ich hätte Ihren Kommentar als Antwort akzeptiert, wenn Sie ihn als einen gepostet hätten :-) –

0

Derive von boost::noncopyable

+1

Das ist äquivalent zu Cătălins Antwort und hat das gleiche Problem; es verhindert nicht das Durchlaufen von '...', da dies zu undefiniertem Verhalten führt, nicht zu einer Kopie. –

0

ausblenden Copykonstruktor und Zuweisungsoperator (erklären sie privat, keine Notwendigkeit, sie zu implementieren). Oder leiten Sie die Klasse von boost :: noncopyable ab (was den gleichen Effekt hat). Wenn Sie Argumente nach Wert übergeben, wird die Verwendung des Kopierkonstruktors bestimmt.

+2

Außer hilft das nicht, da die Instanz nicht als Wert übergeben wird, sondern einige rohe Bytes übergeben werden und dann 'reinterpret_cast' -ed in' const char * '. Ich denke nicht, dass es ein Mittel auf Sprachniveau gibt, um die Situation zu vermeiden. Sie können sich nur auf die Compiler-Warnung verlassen (z. B. "kann kein Nicht-POD-Objekt über ...") – visitor

+1

Nun der OP sagte in seiner Frage bereits, dass er mit dem Kopierkonstruktor gespielt. Denken Sie, dass auch die Überladung des Zuweisungsoperators wird das Verhalten ändern? Ist das ein Feature/Bug von Visual C++? –

+0

funktioniert nicht, keine Kopie/Zuweisungskonstruktoren aufgerufen –

Verwandte Themen