Multi-character constant warnings

2018-12-31 21:29发布

问题:

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?

回答1:

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.



回答2:

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.



回答3:

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.



回答4:

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