使用 '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 来分隔您的令牌。
我有包含这些声明的代码:
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 来分隔您的令牌。