预处理器中的C#宏定义

C# Macro definitions in Preprocessor

C是否能够像使用预处理器语句的C编程语言那样定义宏?我希望简化某些重复语句的常规键入,如:

1
Console.WriteLine("foo");


不,C不支持像C这样的预处理器宏。另一方面,Visual Studio有代码片段。Visual Studio的代码片段是IDE的一个特性,在编辑器中展开,而不是在编译时由预处理器替换。


您可以使用C预处理器(如mcpp)并将其安装到.csproj文件中。然后,在源文件上从编译到预处理或您称之为它的任何东西更改"构建操作"。只需将beforebuild添加到.csproj中,如下所示:

1
2
3
4
5
  <Target Name="BeforeBuild" Inputs="@(Preprocess)" Outputs="@(Preprocess->'%(Filename)_P.cs')">
<Exec Command="..\Bin\cpp.exe @(Preprocess) -P -o %(RelativeDir)%(Filename)_P.cs" />
<CreateItem Include="@(Preprocess->'%(RelativeDir)%(Filename)_P.cs')">
  <Output TaskParameter="Include" ItemName="Compile" />
</CreateItem>

您可能需要手动将compile更改为至少对一个文件进行预处理(在文本编辑器中),然后"预处理"选项应可用于在Visual Studio中进行选择。

我知道宏被严重过度使用和误用,但是完全删除它们即使不是更糟也同样糟糕。宏使用的一个典型示例是notifypropertychanged。每一个不得不手工编写这段代码几千次的程序员都知道没有宏是多么痛苦。


我用这个来避免Console.WriteLine(...)

1
2
3
public static void Cout(this string str, params object[] args) {
    Console.WriteLine(str, args);
}

然后您可以使用以下内容:

1
2
"line 1".Cout();
"This {0} is an {1}".Cout("sentence","example");

它简洁又有点古怪。