Why does this fail to compile?

char programDate[] = "("__DATE__")";

But this compiles fine (see space):


I do know VC2015 now supports literal-operators. But shouldn't that be in compilation phase? __DATE__ should have been processed by the pre-processor. What is going on here?

I thought of some mix-match issue with Unicode/non-Unicode build - but it doesn't help. It's not just issue with pre-defined macros, but with user defined also:

#define MACRO "abc"
char data[] = "("MACRO")";


Error C3688 invalid literal suffix '__DATE__'; literal operator or literal operator template 'operator ""__DATE__' not found
  • I think you may be on to something in your comment about user defined literals. Generally C++ parsers are maximum munch, for each token they gulp in as many characters as possible until it's no longer a valid token. – Cheers and hth. - Alf Jul 31 '15 at 5:42
  • You could write the compilation error. – Antonio Pérez Jul 31 '15 at 5:42

Since C++11, user-defined literals exist and are part of preprocessing. The grammar is:

    // other stuff...

    string_literal ud-suffix


So "("__DATE__ matches preprocessing-token, but "(" __DATE__ doesn't (that is two separate preprocessing tokens).

Macro replacement happens after tokenization. Since there is no token __DATE__ in your first example, there is no replacement.

| improve this answer | |
  • 1
    In case anyone didn't realize the C++ preprocessor differs from the C preprocessor... now you do :) – M.M Jul 31 '15 at 5:51
  • 4
    With C++11 user-defined literals in VS 2015, you can also run into problems with L"Hello, "L"World" would work before but fails with the same error because it tries to use the second L as a UDF. You fix it with whitespace: L"Hello, " L"World" – Chuck Walbourn Jul 31 '15 at 6:18
  • And thankfully now mismatched strings can be concatenated - so second L isn't needed! (stackoverflow.com/questions/31809141/…) – Ajay Aug 5 '15 at 6:37
  • Was it changed because it conflicts with postfix string operators "Hello world"s ? en.cppreference.com/w/cpp/string/basic_string/operator%22%22s – Sandburg Apr 25 '18 at 13:03

Your Answer

