在谷歌看来,这似乎是不可能的,但是:
如何在 C++/CX 'ref class' 中定义 'out' 参数?
如果您的回答是这不可能,请提供参考。
在谷歌看来,这似乎是不可能的,但是:
如何在 C++/CX 'ref class' 中定义 'out' 参数?
如果您的回答是这不可能,请提供参考。
任何类型的参数T*
(其中T
是 ABI 合法类型)都将被编译器视为输出参数,并在元数据中进行修饰。以下代码:
namespace TestMakePublic {
public ref class Class1 sealed
{
public:
void foo(int* out1, Object^* out2){}
};
}
在元数据中生成一个函数,如下所示(ildasm 输出):
.method public hidebysig newslot virtual final
instance void foo([out] int32& out1,
[out] object& out2) runtime managed
{
.override TestMakePublic.__IClass1PublicNonVirtuals::foo
} // end of method Class1::foo
请注意,WinRT 不支持“输入/输出”参数,因此 和 的值out1
仅对out2
从函数返回有效,不能作为foo
.
它是 C# 特定的关键字,COM 在 IDL 语法中也有它。MSVC++ 中的等价物是 [out] 属性。
但是不,如果您尝试使用 C3115,编译器将拒绝它。请记住,您使用 C++/CX 语言扩展来编写其他语言使用的代码。总的来说,对 [out] 概念的支持非常差。C++、Javascript 或 .NET 语言(如 vb.net)都不支持它。您也可以在 C:\Program Files (x86)\Windows Kits\8.0\Include\WinRT 中的 .h 文件中看到这一点,这些文件是从具有 [out] 属性的同一目录中的 .idl 文件生成的。它被 midl 在 .h 文件中剥离。
无论如何都没关系,因为您的代码将在进程内使用,因此 [out] 能够优化参数值的编组并没有任何好处。只需一个简单的指针即可完成工作。然而,必须在 C# 代码中初始化参数值是不可避免的损失。
您可以使用:
_Out_opt_
_Out_
但这些仅适用于私人、内部和受保护的成员 AFAIK。