C++11: Invalid Suffix on Literal Warning/Error
I recently came across this unexpected error when compiling C++ code using Clang:
error: invalid suffix on literal; C++11 requires a space between literal and identifier
I got a similar message, although as a warning, when compiling the same code with GCC:
warning: invalid suffix on literal; C++11 requires a space between literal and string macro
The problem occurs when compiling code like this:
printf("Test %"PRIu32"\n", x);
Note that there is no space between the string Test %
and PRIu32
which is
apparently a requirement in C++11 (or newer). Fortunately, the fix is quite
simple – just add spaces between the string and identifier. So the equivalent
code below fixes the problem:
printf("Test %" PRIu32 "\n", x);
But what if you have a lot of legacy code that you cannot modify? There are a couple of flags that can disable the warnings/errors, but these are different for Clang and GCC.
NOTE: An obvious way to get rid of the problem in both Clang and GCC is to
indicate a C++ standard version earlier than C++11. For example, invoking the
compiler with the flag -std=c++03
fixes the problem, but of course, this is
not an ideal solution.
Clang
In Clang, the invalid suffix literal
message shows as an error by default.
You can turn it into a warning message with the
-Wno-error=reserved-user-defined-literal
flag. Alternatively, you can
completely eliminate the warning/error message with -Wno-reserved-user-defined-literal
.
For example,
clang++ -std=c++11 -Wno-error=reserved-user-defined-literal -c -o test.o test.cpp
NOTE: This page from the Clang documentation explains how the warning and error flags work.
GCC
In GCC, the invalid suffix literal
message shows as a warning by default. You
can eliminate the message with the Wno-literal-suffix
flag. For example,
g++ -std=c++11 -Wno-literal-suffix -c -o test.o test.cpp
NOTE: This page from the GCC documentation explains how the warning and error flags work.