【问题标题】:How do I use ConditionalAttribute in C++-CLI?如何在 C++-CLI 中使用 ConditionalAttribute?
【发布时间】:2018-05-10 07:01:53
【问题描述】:

我有一个 C++-CLI ref 类,它公开了一个用 C++ 实现的分析基础结构。

在 C++ 中,我有预处理器指令 PROFILING_ENABLED 来确定侵入式分析函数是否在代码中。

将这些暴露给托管代码时,我认为使用托管ConditionalAttribute 是合适的。但我在语法上很挣扎。

这是我的尝试:

#ifdef PROFILING_ENABLED

// c++ macros are defined and active on the project level, I would like the 
// conditional attribute to be active as well.

#define MANAGED_PROFILING_ENABLED

// how do I define the managed conditional "MANAGED_PROFILING_ENABLED" in C++-CLI?



#endif

    public ref class Profiler
    {
    public:
        [ConditionalAttribute("MANAGED_PROFILING_ENABLED")] // this compile but always inactive
        static void PushRange(System::String ^ name, Color color);

        [ConditionalAttribute("MANAGED_PROFILING_ENABLED")]
        static void PopRange();
    };

我想实现以下目标: 如果原生 c++ 预处理器指令是 active,则托管 ConditionalAttribute 也应该是 active。 另一方面,如果原生 c++ 预处理器指令是inactive,则托管的 ConditionalAttribute 应该是inactive

【问题讨论】:

  • 我会进一步澄清。一切都会编译,C++ 预处理器指令肯定是活动的。只有管​​理条件属性始终为假。我希望它根据 c++ 预处理器指令是否处于活动状态。
  • @AdrianoRepetti 我做了一些编辑,希望这能让意图更清晰。
  • C++/CLI 编译器没有管道来执行 [Conditional] 事情,您应该以 C++ 方式执行此操作。使用#ifdef。
  • @HansPassant 当我在 C++/CLI 上使用 [Conditional] 时,它确实有效果。只是缺少字符串条件参数。无论如何,我现在使用#ifdef。

标签: c++ c++-cli managed


【解决方案1】:

以下标准文档相当陈旧。但假设,可能仍然有效。

https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-372.pdf

转到第 29.4.3 节(您可以在下面找到有关 c++/CLI 中条件属性的内容)。

C++/CLI 不提供这种能力;虽然这个属性 类型被接受,它们对代码生成没有影响或 执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多