C# 预处理器指令可以嵌套吗?

wec*_*cky 1 c# preprocessor

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

#if FOO
// do something
#if BAR
// do something when both FOO and BAR are defined
#endif 
#endif
Run Code Online (Sandbox Code Playgroud)

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

#if FOO && (!BAR)
#elif FOO && BAR
#endif
Run Code Online (Sandbox Code Playgroud)

(编辑)实际上,我的代码中已经有一个更复杂的嵌套语句,但它没有按照我的预期执行。因此,我很好奇是否有官方对此的看法。

ang*_*son 5

是的,它们可以嵌套。

#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
}
Run Code Online (Sandbox Code Playgroud)

输出:

A and B
Run Code Online (Sandbox Code Playgroud)

这是一个.NET Fiddle供您尝试。

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

#define A
// #define B
Run Code Online (Sandbox Code Playgroud)

输出:

A and not B
Run Code Online (Sandbox Code Playgroud)

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

#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
}
Run Code Online (Sandbox Code Playgroud)