2016-08-03 27 views
0

Ich benutze eine Bibliothek (GNU MicroHttpDaemon), die Fehlermeldungen durch einen Rückruf ausgibt, der eine va_list nimmt. Ich gebe einen Funktionszeiger ein und wenn ein Fehler auftritt, wird meine Funktion mit einer va_list und einigen anderen Parametern aufgerufen. Mein Problem ist, dass, wenn ich die va_list erhalte, es Müll ist und der Versuch, es zu benutzen, verursacht, dass eine Ausnahme geworfen wird. Ich verwende Visual Studio 2015 unter Windows 10. MicroHttpDaemon wurde mit dem gleichen Compiler erstellt. Meine beste Vermutung für die Ursache ist, dass MicroHttpDaemon in C geschrieben wird, aber ich benutze C++. Kann jemand bestätigen, dass dies das Problem ist? Wenn es dann ist, kann ich irgendetwas tun, um die Argumente in meinen C++ Code zu bekommen? Mein Rückruf ist unten, wenn es irgendeinen Gebrauch ist. Beachten Sie, dass es sich um eine statische Methode handelt, daher sollte es im Allgemeinen in Ordnung sein, sie als C-Callback zu verwenden, denke ich.Ist va_list inkompatibel zwischen C und C++?

+0

Nein, ich bin mir dessen nicht bewusst. Könnten Sie bitte ein MCVE bereitstellen, das Ihr Problem reproduziert? –

+1

Warum verwalten Sie den Speicher manuell und versuchen dann, ihn auf allen Ausgangspfaden freizugeben? Verwenden Sie einfach einen der folgenden Befehle: 'std :: vector ' oder 'std :: string'. Zumal du es sowieso in 'std :: string 'umwandeln wirst. –

+1

Auch 'va_list' wurde entwickelt, um als Wert übergeben zu werden, vielleicht geht etwas schief, wenn Sie darauf verweisen. Können Sie den Code anzeigen, der dies aufruft? (Oder weil es ein Callback ist, macht den Funktionszeiger) –

Antwort

4

va_list &ap - ein Callback von C wird nichts als Referenz übergeben. Die Funktion sollte die Liste nach Wert übernehmen.