在 C# 的 #if 中使用 #define 预处理器指令是不是有效

Posted

技术标签:

【中文标题】在 C# 的 #if 中使用 #define 预处理器指令是不是有效【英文标题】:Is it valid to use the #define preprocessor directive inside an #if in C#在 C# 的 #if 中使用 #define 预处理器指令是否有效 【发布时间】:2016-10-04 21:42:20 【问题描述】:

我可以在 C# 中的 #if#endif 中使用 #define preprocessor directive 吗?

例如

#if !SILVERLIGHT && !__android__ && !__ios__ 
#define SupportsMutex
#endif

看起来它有效,但我需要确定。有很多关于这方面的文章,但大多数时候是在 C 而不是 C# 的上下文中 - C# 中的预处理器指令 a 更加有限。

Visual Studio 的突出显示似乎支持它,但根据语言/编译器规范,这真的有效吗?

This MSDN page 给出以下注释:

#define 指令不能像在 C 和 C++ 中那样用于声明常量值。 C# 中的常量最好定义为类或结构的静态成员。如果您有多个此类常量,请考虑创建一个单独的“常量”类来保存它们。

我需要这个,因为多次使用#if !SILVERLIGHT && !__ANDROID__ && !__IOS__ 很难管理。

当然我们也可以将SupportsMutex添加到项目的“条件编译符号”中,但这更难管理,也更不透明。

【问题讨论】:

【参考方案1】:

是的。查看C# specification,此用法的特定示例在2.5.3 声明指令部分中给出并被视为有效:

#define Enterprise
#if Professional || Enterprise  
   #define Advanced
#endif 
namespace Megacorp.Data 

    #if Advanced    
    class PivotTable ...  
    #endif 

【讨论】:

谢谢!很快就找到了!

以上是关于在 C# 的 #if 中使用 #define 预处理器指令是不是有效的主要内容,如果未能解决你的问题,请参考以下文章

C#预处理器指令——学习

C#-#define条件编译

C#-C#-#define条件编译

C语言-预处理(#define#if...)

C语言-预处理(#define#if...)

#define 预处理器指令可以包含 if 和 else 吗?