C++ in MS Visual Studio 2008. Warnstufe 4 plus eine Ladung zusätzlicher Warnungen aktiviert. Ich würde erwarten, dass dies eine Warnung geben mindestens, aber wahrscheinlicher ein Compilerfehler?Warum/wie kompiliert sich das?
Funktionsdeklaration ist wie folgt:
int printfLikeFunction(
const int bufferLength,
char * const buffer,
const char * const format,
...);
Nutzungscode - gibt es ein Tippfehler: Obwohl die ARRAY_SIZE von Outputgeben wird in, Output selbst ist nicht - sicher sollte dies nicht kompilieren:
printfLikeFunction(ARRAY_SIZE(outputBuffer), "Format: %s, %s", arg1, arg2);
Dies ist eindeutig falsch und ein Fehler wurde gemacht. Allerdings hätte der Compiler es fangen sollen! Der Puffer-Parameter sollte ein char-Zeiger sein, und es wird ein String-Literal übergeben, das ein const char-pointer ist. Dies muss ein Fehler sein. (arg1 und arg2 sind auch (möglicherweise const) char Zeiger, so zufällig die Deklaration übereinstimmt auch ohne outputBuffer an der richtigen Stelle).
Zur Laufzeit stürzt dieser Code ab, wenn er versucht, in das Zeichenfolgenliteral zu schreiben. Keine Überraschung, ich verstehe einfach nicht, wie es kompilieren durfte.
(Dies ist jedoch vermutlich der Grund, warum sprintf_s die Puffer- und Größenparameter in einer anderen Reihenfolge als diese Funktion hat - sie macht solche Fehler eindeutig fehl.)
Wow. Was für eine verrückte Entscheidung! Aber, ja, ich habe gerade den Standard überprüft und Sie haben absolut Recht. Nicht zu fassen! –
Sie würden hoffen, dass Visual Studio eine Warnung ausgeben würde, wenn veraltete und verrückte Funktionen des Standards verwendet werden. –
Ja ... auch wenn "Verrücktheit" subjektiv ist, veraltet ist das nicht, so dass es mich erstaunt, dass dies keine Warnung hervorbrachte. –