Why is this a warning? I think there are many cases when is more clear to use multi-char int constants instead of \"no meaning\" numbers or instead of defining const variables with same value. When parsing wave/tiff/other file types is more clear to compare the read values with some \'EVAW\', \'data\', etc instead of their corresponding values.
Sample code:
int waveHeader = \'EVAW\';
Why does this give a warning?
According to the standard (§6.4.4.4/10)
The value of an integer character constant containing more than one
character (e.g., \'ab\'), [...] is implementation-defined.
long x = \'\\xde\\xad\\xbe\\xef\'; // yes, single quotes
This is valid ISO 9899:2011 C. It compiles without warning under gcc
with -Wall
, and a “multi-character character constant” warning with -pedantic
.
From Wikipedia:
Multi-character constants (e.g. \'xy\') are valid, although rarely
useful — they let one store several characters in an integer (e.g. 4
ASCII characters can fit in a 32-bit integer, 8 in a 64-bit one).
Since the order in which the characters are packed into one int is not
specified, portable use of multi-character constants is difficult.
For portability sake, don\'t use multi-character constants with integral types.
This warning is useful for programmers that would mistakenly write \'test\'
where they should have written \"test\"
.
This happen much more often than programmers that do actually want multi-char int constants.
If you\'re happy you know what you\'re doing and can accept the portability problems, on GCC for example you can disable the warning on the command line:
-Wno-multichar
I use this for my own apps to work with AVI and MP4 file headers for similar reasons to you.
Even if you\'re willing to look up what behavior your implementation defines, multi-character constants will still vary with endianness.
Better to use a (POD) struct { char[4] }; ... and then use a UDL like \"WAVE\"_4cc to easily construct instances of that class