Forum: PC-Programmierung [c++] auto c = 'a/a'; // wtf ?


von Vlad T. (vlad_tepesch)


Lesenswert?

nachdem ich ein paar Tage Python gemacht habe, sind mir in c++ anstelle 
von double quotes, single quotes um ein String-Literal gerutscht.
Und zwar an einer Stelle, die sowohl ints, als auch QStrings akzeptiert.

Als ich den Fehler gefunden habe, hab ich nicht schlecht gestaunt, dass 
es keine Compilerwarnungen gab.

ein testweises
1
auto c = 'a/a';
 bringt zu tage, dass c in dem Fall ein 'int' ist.

WTF

wofür ist das gut?

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

1
% c++ -Wall -Wextra -c foo.c
2
foo.c:1:9: warning: multi-character character constant [-Wmultichar]
3
 int c = 'a/a';

von NaNaN (Gast)


Lesenswert?

Ich arbeite nach Jahren mal wieder an einem C++ Projekt und es ist - 
nett formuliert - mühsam.
Alleine über "C++ Compiler Konfiguration" könnte man eine ganze 
Vorlesung halten.

von Vlad T. (vlad_tepesch)


Lesenswert?

naja, der msvc10 mit /W4 sagt gar nix.

Ich hätte aber sogar ein Error erwartet.
Was soll das?

mit Hilfe des Stichwortes "multi-character character constant" hab ich 
das gefunden:

https://stackoverflow.com/questions/26086600/warning-multi-character-character-constant-wmultichar
1
For 'rise', this is valid ISO 9899:1999 C. 
2
It compiles without warning under gcc with 
3
-Wall, and a “multi-character character constant” warning with -pedantic.
4
5
According to the standard (§6.4.4.4.10),
6
7
    The value of an integer character constant containing 
8
    more than one character (e.g., 'ab'), [...] 
9
    is implementation-defined.


Oh Mann.
Beim genaueren Nachlesen fragt man sich, was das Komitee da geritten 
hat, das in den Standard zu nehmen:
http://www.zipcon.net/~swhite/docs/computers/languages/c_multi-char_const.html

Implementation defined behaviour ohne Ende.

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

Da hat bestimmt Apple drauf bestanden.

Mac OS 9 hatte endlos 4-Byte Konstanten als "magic words" in der 
resource fork. Wenn ich mich recht erinnere, ist das im Code für HFS+ 
heute noch ähnlich drin.

von Mark B. (markbrandis)


Lesenswert?

Vlad T. schrieb:
> naja, der msvc10 mit /W4 sagt gar nix.

Dann nimm halt einen richtigen Compiler.

SCNR

von template typename (Gast)


Lesenswert?

Mark B. schrieb:
> Vlad T. schrieb:
>> naja, der msvc10 mit /W4 sagt gar nix.
>
> Dann nimm halt einen richtigen Compiler.
>
> SCNR

Stimmt schon so. Die Compiler von MS sind bis Version 12 absoluter 
Schrott, die neueren gerade so akzeptabel. Besser ist es, wenn der OP 
clang oder gcc nimmt.

von Echte Computer sind PCs überlegen (Gast)


Lesenswert?

> Implementation defined behaviour ohne Ende.

  Das ist der Stolz jedes C/C++ Verfechters. Schliesslich ist das 
Weltstandard und kein echter Programmierer will sich irgendwie 
einschänken lassen, schon gar nicht von seiner Lieblingssprache.

  Im Übrigen ist mein Standard besser als alle anderen zusammen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Echte Computer sind PCs überlegen schrieb:
> Das ist der Stolz jedes C/C++ Verfechters.

Solche Bemerkungen sind der Stolz eines jeden Forentrolls.

Die Crux mit Standards ist es einfach, dass sie, wenn sie auch von
einer Mehrheit akzeptiert werden sollen, mit Kompromissen leben lernen.
Da ist ganz viel “historical precedence” mit im Spiel, es soll das,
was schon immer so gemacht worden ist, eben so festgeschrieben werden,
dass man sich danach auch drauf verlassen kann (oder eben, wie hier,
im Handbuch nachsehen kann, wie's konkret läuft).

Ich erlebe das täglich auf der Austin-Mailingliste („Posix“).  Es
schlägt gerade zum vermutlich x-ten Mal jemand vor, dass man doch
wenigstens Newlines aus dem für Dateinamen zulässigen Zeichensatz
verbannen möge.  Ich vermute, er wird keinen Erfolg haben, weil es
eben zwar viele gute Gründe dafür gäbe, aber keine einzige
Implementierung, die es derzeit so handhabt.  Der Standard fühlt sich
nicht zuständig, den Implementierungen etwas aufzudrängen, was bislang
noch keiner so getan hat …

Gerade auch dank der Kompromissfähigkeit dürfte C eine Akzeptanz
aufweisen, die eben schönere, sauberer gestaltete Sprachen bislang
nicht aufweisen können.  Versuche dafür gab's ja durchaus.

von Arc N. (arc)


Lesenswert?

Jörg W. schrieb:
> Die Crux mit Standards ist es einfach, dass sie, wenn sie auch von
> einer Mehrheit akzeptiert werden sollen, mit Kompromissen leben lernen.
> Da ist ganz viel “historical precedence” mit im Spiel, es soll das,
> was schon immer so gemacht worden ist, eben so festgeschrieben werden,
> dass man sich danach auch drauf verlassen kann (oder eben, wie hier,
> im Handbuch nachsehen kann, wie's konkret läuft).

Etwas OT: Fefe hatte da die Tage ein schönes Paper verlinkt...
"What every compiler writer should know about programmers
or
“Optimization” based on undefined behaviour hurts performance"
http://www.complang.tuwien.ac.at/kps2015/proceedings/KPS_2015_submission_29.pdf

von Jodel (Gast)


Lesenswert?

Man sieht doch auch hier im Forum schoen, wie viele Ingenieure so 
ticken. Die Mehrheit ist eben nicht innovativ, sondern 
Status-Quo-Bewahrer. Da wird dann bis auf's Messer verteidigt, was man 
oft nicht mal selbst verstanden hat...

von Ralf G. (ralg)


Lesenswert?

Vlad T. schrieb:
> wofür ist das gut?

Für lesbare 'Kennwörter'. Gab's auch beim Amiga-OS. Hier ist das anhand 
der 'Colormap' in einer Bilddatei beschrieben:
https://de.wikipedia.org/wiki/Interchange_File_Format#CMAP-Chunk

Beim Lesen der Datei muss dann kein String ausgewertet werden und man 
spart außerdem ein Byte für den Stringabschluss.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ralf G. schrieb:
> Vlad T. schrieb:
>> wofür ist das gut?
>
> Für lesbare 'Kennwörter'. Gab's auch beim Amiga-OS.

Haben denn die damaligen C-Compiler auf dem Amiga (Lattice und Manx)
diese Multi-Byte-Zeichenkonstanten überhaupt schon unterstützt? Aber
selbst wenn: Beim Manx-Compiler war ein int nur 16 Bit groß, so dass da
gar kein FourCC hineingepasst hätte.

Auch auf einem modernen PC funktioniert das nicht wie gewünscht, denn
folgender Code (kompiliert mit GCC) schreibt nicht etwa "CMAP", sondern
"PAMC" in die Datei:

1
  int cmap = 'CMAP';
2
  fwrite(&cmap, sizeof cmap, 1, fp);
3
}

von Ralf G. (ralg)


Lesenswert?

Yalu X. schrieb:
> Haben denn die damaligen C-Compiler auf dem Amiga (Lattice und Manx)
> diese Multi-Byte-Zeichenkonstanten überhaupt schon unterstützt?

Ich hatte Anfang(*) der 90er 'Maxon'. Das funktionierte.

Yalu X. schrieb:
> Auch auf einem modernen PC funktioniert das nicht wie gewünscht, denn
> folgender Code (kompiliert mit GCC) schreibt nicht etwa "CMAP", sondern
> "PAMC" in die Datei:

... Byteorder. Die war beim Amiga 'andersrum'. Am PC habe ich dann eben 
nach 'PAMC' gesucht, um 'CMAP' zu finden ;-)

--------

Hab mal nach dem Handbuch gesehen: war später. Der Compiler war von '96.
Vorher hatte ich mit BASIC gespielt. Da ging das aber auch.

: Bearbeitet durch User
von Fabian O. (xfr)


Lesenswert?

In Windows-Treibern nutzt man das, um dynamisch allokierten Speicher mit 
einem 4 Byte langem Tag zu versehen. Diese Tags kann man z.B. mit 
Poolmon oder im Debugger auswerten, wenn man nach Memory Leaks sucht.

Siehe ExAllocatePoolWithTag:
https://msdn.microsoft.com/en-us/library/windows/hardware/ff544520%28v=vs.85%29.aspx

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.