c – lambda可以有“C”连接吗?
这个标题或多或少地说了一切.我有以下一点
的代码: #include <vector> #include <string> #include <iterator> #include <algorithm> struct xloper12; class Something { public: std::string asString() const; }; extern std::vector<Something> ourSomethings; class ExcelOutputLoader { public: void load( std::vector<std::string> const& value ); xloper12* asXloper() const; }; extern xloper12* ProcessException( std::string const& functionName ); extern "C" __declspec(dllexport) xloper12* getSomethingList() { try { std::vector<std::string> results; results.reserve( ourSomethings.size() ); std::transform( ourSomethings.begin(),ourSomethings.end(),std::back_inserter(results),[]( Something const& o ) { return o.asString(); } ); ExcelOutputLoader out; out.load( results ); return out.asXloper(); } catch (...) { return ProcessException( "GetSomthing" ); } } 我用虚拟代替了大多数非标准头文件 falseWarning.cc(34) : warning C4190: '<Unknown>' has C-linkage specified,but re turns UDT 'std::basic_string<_Elem,_Traits,_Alloc>' which is incompatible with C with [ _Elem=char,_Traits=std::char_traits<char>,_Alloc=std::allocator<char> ] (重复四次,好的措施).但据我所知 这不是一件大事:这只是一个警告,它很容易工作 编辑: 还有一些测试.如果我写的东西像: extern "C" __declspec(dllexport) void funct1() { extern std::string another(); } 我也得到警告.这一次,我会说这是对的. 另一方面,如果我写的东西像: extern "C" __declspec(dllexport) void funct2() { class Whatever { public: std::string asString() { return std::string(); } }; std::string x = Whatever().asString(); } 没有警告.在这种情况下,编译器正确执行 这让我想知道一点.是编译器处理 解决方法
这似乎不符合标准.
5.1.2:
7.5:
因此,函数调用运算符或函数指针的转换函数都不具有C语言链接,因为它们是类成员函数;但是由于5.1.2p6没有指定转换函数返回的函数在哪里声明,所以它的类型可能具有C语言连接. 一方面,如果我们考虑7.5p4中的一个例子: extern "C" { class X { // ... void mf2(void(*)()); // the name of the function mf2 has C++ language // linkage; the parameter has type pointer to // C function }; } 这表明对函数指针的转换将具有C函数的返回类型指针,只要C函数类型在转换声明内部声明或在extern“C”块中被声明为内联: extern "C" { class Y { (*operator void())(); // return type pointer to C function }; } 另一方面,该功能需要与函数调用运算符具有相同的效果,如果C语言联动阻止它是不可能的;我们可以得出结论,该函数必须在外部“C”块之外声明,类似的是转换函数的返回类型.但这可能会对编译器作者造成额外的工作量. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |