为什么没有独立的C#预处理器?

时间:2015-05-26 22:42:28

标签: c# c-preprocessor

有谁知道为什么没有独立的C#预处理器?也许是因为C#的一些语法特性使得分别运行预处理器阶段变得更加困难?

2 个答案:

答案 0 :(得分:2)

因为从未真正有过预处理器,并且通过#前缀行公开的某些功能与编译器的其他部分交互。

#define SOME_VARIABLE#if看起来像C / C ++预处理程序指令只不过是C#设计者的语法选择。

特别是这些"指令"与编译过程的其余部分不正交,例如ConditionalAttribute将检查构建变量,以便在编译时包含或排除给定的调用。

答案 1 :(得分:1)

C#参考说:

  

虽然编译器没有单独的预处理器,但是本节中描述的指令将被处理,就像有一个指令一样。

由此我推断,将预处理器分离为单独的工具是可行的(从语言学的角度来看)。但是微软还没有做到这一点。

我可以想到两个原因:

  • 在执行此操作时,Microsoft管理层可能看不到任何商业价值(对Microsoft)。

  • C#语言设计者可能想要阻止(他们所看到的)滥用C#预处理器。例如,(IMO)从C#中剥离条件编译代码对几乎每个人都是坏的,并且在非C#的源代码上使用C#预处理器可能是一个坏主意。

  • 他们可能想避免给想要创建基于C#语法的新第三方语言的人免费“支持”。

(好吧 - 我不知道微软/ C#语言设计师实际是否持有这些观点。没有人这样做。但是,这些都是微软没有做到这一点的合理解释,而且合理的解释都是那些你无法“询问”的人可以得到无法解释的决定。)

我不太了解C#是否评论ConditionalAttribute等是否会导致问题。但是,似乎可以找到解决办法;例如预处理程序命令行选项,用于将#defines重新注入预处理的输出。