Windows runtime 我如何定义';输出';C+中的参数a+;CX Windows运行时组件?

Windows runtime 我如何定义';输出';C+中的参数a+;CX Windows运行时组件?,windows-runtime,c++-cx,Windows Runtime,C++ Cx,从谷歌的角度来看,这似乎是不可能的,但是: 如何在C++/CX“ref类”中定义“out”参数 如果您的答案是这不可能,请提供参考。这是一个C#特定的关键字,COM在IDL语法中也有它。MSVC++中的等效项是[out]属性 但是不,如果您尝试使用C3115,编译器将拒绝使用它。请记住,您使用C++/CX语言扩展来编写其他语言使用的代码。一般来说,这很难支持[退出]的概念。无论是C++、JavaScript还是.NET语言,如VB.NET都支持它。您也可以在C:\Program files(x8

从谷歌的角度来看,这似乎是不可能的,但是:

如何在C++/CX“ref类”中定义“out”参数

如果您的答案是这不可能,请提供参考。

这是一个C#特定的关键字,COM在IDL语法中也有它。MSVC++中的等效项是[out]属性

但是不,如果您尝试使用C3115,编译器将拒绝使用它。请记住,您使用C++/CX语言扩展来编写其他语言使用的代码。一般来说,这很难支持[退出]的概念。无论是C++、JavaScript还是.NET语言,如VB.NET都支持它。您也可以在C:\Program files(x86)\Windows Kits\8.0\Include\WinRT中的.h文件中看到这一点,该文件是从具有[out]属性的同一目录中的.idl文件生成的。midl在.h文件中删除了它

无论如何,这并不重要,因为您的代码将在进程中使用,所以[out]能够优化参数值的封送处理根本没有任何好处。只要一个简单的指针就可以完成任务。但是,必须在C代码中初始化参数值是不可避免的损失。

您可以使用:

  • \u Out\u opt\u
  • \u Out\u

  • 但这些参数仅适用于私有、内部和受保护的AFAIK成员。

    任何类型为
    T*
    (其中
    T
    是ABI合法类型)的参数都将被编译器视为out参数,并在元数据中进行修饰。以下代码:

    namespace TestMakePublic {
     public ref class Class1 sealed
     {
     public:
       void foo(int* out1, Object^* out2){}
     };
    }
    
    在元数据中生成如下所示的函数(ildasm输出):


    请注意,WinRT不支持“in/out”参数,因此
    out1
    out2
    的值仅在从函数返回时有效,不能被信任作为
    foo
    的输入这些是SAL注释,只影响静态代码分析。在正常编译中,它们的计算结果为零。答案很有帮助。你在官方文件中有提到这一点吗?
    .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