【问题标题】:Can C# preprocessor directives be nested?C# 预处理器指令可以嵌套吗?
【发布时间】:2019-04-05 18:22:07
【问题描述】:

我进行了一些谷歌搜索,但没有发现任何关于预处理器指令嵌套的正面陈述。我希望能够做这样的事情:

#if FOO
// do something
#if BAR
// do something when both FOO and BAR are defined
#endif 
#endif

我知道我可以做类似下面的事情,但只是想知道。

#if FOO && (!BAR)
#elif FOO && BAR
#endif

(编辑)实际上,我的代码中已经有一个更复杂的嵌套语句处于活动状态,但它并没有达到我的预期。因此我很好奇是否有官方对此的看法。

【问题讨论】:

  • 我想知道官方对此的立场,在c#语言教程中找不到任何cmets。
  • documentation 没有说任何关于嵌套的内容,所以我认为这个问题是有效的。

标签: c# preprocessor


【解决方案1】:

是的,它们可以嵌套。

#define A
#define B

void Main()
{
#if A
#if B
    Console.WriteLine("A and B");
#else
    Console.WriteLine("A and not B");
#endif
#else
#if B
    Console.WriteLine("B and not A");
#else
    Console.WriteLine("neither A nor B");
#endif
#endif
}

输出:

A and B

这里有一个.NET Fiddle 供您尝试。

您可以单独注释掉顶部的两行以获得不同的结果,例如:

#define A
// #define B

输出:

A and not B

这是相同的带有缩进的代码,可以使其更清晰,但我不会像这样缩进代码。在我看来,过度使用这样的条件指令是一种代码异味。

#define A
// #define B

void Main()
{
    #if A
        #if B
            Console.WriteLine("A and B");
        #else
            Console.WriteLine("A and not B");
        #endif
    #else
        #if B
            Console.WriteLine("B and not A");
        #else
            Console.WriteLine("neither A nor B");
        #endif
    #endif
}

【讨论】:

  • 谢谢,我想用它来真正从可执行文件中排除不同软件版本(以不同价格出售)的代码。但它很快就会变得复杂。我很惊讶在 C# 语言教程中找不到任何关于它的正面陈述。
  • 处理此问题的另一种方法是为不同版本使用不同的程序集,并且仅将正确的程序集与每个版本捆绑在一起。
  • 或者,使用许可或标志使代码不可用。
  • 使用标志,代码仍然存在于可执行文件中。想要防止这种情况发生。
  • 那么不同的程序集是一种更清洁的方式。如果您非常喜欢依赖注入,那么我将创建一个包含应用程序其余部分可以使用的所有接口的程序集,然后使用不同的实现来区分程序集,以便您为正确的软件版本添加正确的实现.
猜你喜欢
  • 1970-01-01
  • 2011-10-04
  • 2010-09-23
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多