使用 'extern "C"' 时导致错误 "expected a string literal, but found a user-defined string literal instead" 的原因是什么?

What causes error "expected a string literal, but found a user-defined string literal instead" when using 'extern "C"'?

我有包含这些声明的代码:

class IRealNetDll;

extern "C"__declspec(dllexport)
IRealNetDll * CreateRealInstance(int ilicence);

这可以在 Win7 上使用 Visual Studio 2012 正确构建。

但是在 VS 2015、2017 上 Windows10,这一行:

extern "C"__declspec(dllexport)

结果:

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C3690: expected a string literal, but found a user-defined string literal instead
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2146: syntax error: missing ';' before identifier 'IRealNetDll'

为什么我会收到此错误,为什么只在较新的编译器上出现,我该如何预防?

而不是

extern "C"__declspec(dllexport)
IRealNetDll * CreateRealInstance(int ilicence);

你应该写

extern "C"
{
__declspec(dllexport) IRealNetDll * CreateRealInstance(int ilicence);
}

当引入用户定义的文字时,它对语言造成了一个小的、破坏性的变化。字符串文字现在需要用 whitespace 与以下标识符分开,否则标识符将被解析为用户定义的文字运算符:

  • "C"__declspec
    

    一个标记,理解为使用 __declspec 转换的用户定义文字。

  • "C" __declspec
    

    两个标记 - 字符串文字 "C" 和标识符 __declspec

您需要添加一个 space 来分隔您的令牌。