2016-04-23 10 views
1

Der Befehl "what" wird in meinem Projekt verwendet, um einige Informationen über ausführbare Dateien abzufragen (Kompilierungsdatum, Version, ...). Ich behebe einen Fehler, bei dem eine Zeile in der Ausgabe fehlt, da wir die Version von gcc geändert haben. Die Zeichenfolge wurde in einem lokalen Bereich definiert:Interaktion zwischen dem Optimierer und Zeichenketten für den Befehl which

char string_for_what = "@(#) Component comp1"; 

Diese Zeichenfolge wurde nie verwendet. Ich nehme an, der Optimierer hat es entfernt.

Ich denke, die normale Korrektur sollte sein, die Zeichenfolge in einem globalen Geltungsbereich zu deklarieren. Aber was verbietet einem zukünftigen Compiler, es zu optimieren, wenn es nicht verwendet wird?

Ich habe über strlen("@(#) Component comp1")strlen("@(#) Component comp1") gedacht, um sicherzustellen, dass die Zeichenfolge verwendet wird, aber es scheint, dass clang diesen Aufruf auf konstanten Zeichenfolgen optimiert.

Shoud ich rufe fopen("@(#) Component comp1")? Wenn jemand eine Datei mit diesem Namen erstellt, kann ich einen Dateideskriptor verlieren. Das scheint zu funktionieren, aber es scheint auch ein bisschen übertrieben zu sein.

+0

Mögliche Duplikat http://stackoverflow.com/questions/ 16349557/does-gcc-have-any-options-zu-add-version-info-in-elf-binary-datei –

Antwort

1

Das Verschieben dieser Deklaration in einen globalen Bereich kann leicht zu einer Verletzung von One Definition Rule führen.

Sie können die Optimierung dieser Variablen unter Verwendung des Schlüsselwortes volatile verbieten.

[C++11: 3.7.3:] Wenn eine Variable mit automatischer Speicherdauer hat Initialisierung oder einen destructor mit Nebenwirkungen, so hat er nicht vor dem seinen Block Ende zerstört werden, noch sollen sie als eine Optimierung beseitigt werden, selbst wenn es erscheinen werden nicht verwendete (...)

und:

[C++11: 1.9.12:] durch ein flüchtiges glvalue bezeichnet Zugriff auf ein Objekt (3 .10), ein Objekt ändern, ruft eine Bibliothek I/O-Funktion oder eine Funktion aufrufen, dass tut jede dieser Operationen sind alle Nebenwirkungen

+0

Beraten Sie volatile char string_for_what [] = "@ (#) Component comp1"; oder flüchtige Zeichenfolge string_for_what ("@ (#) Component comp1"); ? Vielen Dank – BOC

+0

@BOC Ich würde ein Char-Array verwenden. –

Verwandte Themen