2014-10-21 18 views
5

Ich schaue mir einen Beispielcode für eine API an, die ich gerade benutze. Das folgende Muster hat mich ein wenig verwirrt:Gibt es einen Grund, const_cast in einem String-Literal in diesem Code zu verwenden?

char* str; 
str = const_cast<char*>("Hello World"); 

printf("%s ", str); 

(. Tatsächlich gibt es einen großen Fall Erklärung, in der str jeweils zugeordnet ist)

Beachten Sie, dass printf nimmt const char*. Gibt es einen vernünftigen Zweck für diese gewundene Umwandlung? Die Autoren dieses Codes wenden viele andere leistungsorientierte Tricks an, aber es gibt keine Erklärung dafür, was hier vor sich geht.

Mein Instinkt ist es, diesen Code zu ändern:

const char* str; 
str = "Hello World"; 

printf("%s ", str); 

Bin ich etwas fehlt?

+6

Ändern Sie es. Der ursprüngliche Code ist gefährlich nah an undefiniertem Verhaltensland. –

+0

Yeah 'puts' macht nicht dasselbe. Warum sollte "Put" in anderen Situationen die bessere Wahl sein? –

+0

@ValekHalfHeart Oh, ja, das war Unsinn, vergiss es. – Columbo

Antwort

3

Ein String-Literal ist eine nicht-const char[N] in C und eine const char[N] in C++. Frühere Versionen des C++ - Standards berücksichtigten ein const Zeichenfolgenliteral, das aus Gründen der Abwärtskompatibilität mit C einem nichtkonstanten char* zugewiesen wurde. Dieses Verhalten wurde in C++ 03 jedoch als veraltet eingestuft und ist jetzt in C++ 11 ohne eine explizite Besetzung, wie die gezeigte. Wenn Sie nur an C++ 11 interessiert sind, sollten Sie str zu const char* ändern. Andernfalls können Sie den Cast für die Abwärtskompatibilität verwenden.

+1

Interessant. Ich vermute, das ist die Hintergrundgeschichte. Der fragliche Code hat viele plattformübergreifende Warzen. Ich benutze C++ 11, aber dieser Code geht wahrscheinlich vor C++ 03 zurück. Welche Unterscheidung treffen Sie zwischen const und readonly? Ich habe mich oft gefragt, was passieren würde, wenn Sie versuchen würden, ein Zeichenfolgenliteral zu ändern. –

+0

@Drew Die Sprache erlaubt Ihnen möglicherweise, sie zu ändern, aber das bedeutet nicht, dass es sicher ist. –

+0

@remyabel, einverstanden. Aber was ändern Sie in diesem Fall? Wenn ein Zeichenfolgenliteral im Code dupliziert wird und der Compiler sie in der ausführbaren Datei konsolidiert, würde dies eine andere Instanz ändern? Könnte dieser Speicherbereich geschützt werden? Ich nehme an, die Antwort auf diese Fragen ist "Es kommt darauf an" :) –

2

Der einzige mögliche Grund könnte sein, dass printf in einer bestimmten Implementierung char* erfordert. Nach einigen Nachforschungen scheint das nicht der Fall zu sein. Andererseits ist es gefährlich, einen Zeiger auf nicht-const char zu haben, der auf ein String-Literal zeigt, da das Ändern eines String-Literals ein undefiniertes Verhalten auslöst. Wenn es ohne die Besetzung funktioniert, gibt es keinen Grund, es dort zu haben, und Sie sollten es sofort ändern.