编译器指令 - 建议 - 仅在调试模式下运行代码
Posted
技术标签:
【中文标题】编译器指令 - 建议 - 仅在调试模式下运行代码【英文标题】:Compilter Directives - Suggestion - Run code in Debug mode only 【发布时间】:2011-07-04 08:23:10 【问题描述】:仅当应用程序在调试模式下运行时,我才需要记录消息。我找到了两种方法:
第一:需要记录的时候需要到处写3行。但是,Logger 语句仅在编译时被禁用,这正是我需要的。 Logger.Log 根本不会被执行。
#if DEV_ENV
Logger.Log("Application started !"); // This line is grayed. Perfect !
#endif
public static void Log(string message)
Debug.WriteLine(message);
第二:非常整洁。需要记录的地方只有一行代码。不确定是否执行 Logger.Log 语句。 如果仅在编译时删除函数调用(与第一种方法相同。但是,现在确定代码行没有变灰),我想这样做。
Logger.Log("Application started !"); // This line is not grayed out. But, function is not called. So, confused whether its removed at compile time.
[Conditional("DEV_ENV")]
public static void Log(string message)
Debug.WriteLine(message);
我担心性能差异。
【问题讨论】:
【参考方案1】:来自MSDN 页面的ConditionalAttribute:
将 ConditionalAttribute 应用于 方法向编译器表明 a 不应该调用该方法 编译到微软中间 语言 (MSIL) 除非有条件 关联的编译符号 定义了 ConditionalAttribute。
因此,正如它所说,方法调用在编译时被删除,与#if
相同。
【讨论】:
【参考方案2】:根据您的编译设置,您可以使用:
if (System.Diagnostics.Debugger.IsAttached)
Logger.Log("Application started !");
或者,
#if DEBUG
Logger.Log("Application started !");
#endif
【讨论】:
【参考方案3】:正如 George 所指出的,如果应用了 Conditional 属性,则不会编译方法调用。这也意味着(与直接使用 #If DEV_ENV
删除代码一样)方法调用中包含的任何副作用也不会发生 - 与往常一样,关于日志代码中存在副作用的警告是有根据的:
public static void Main(String[] args)
int i = 92;
Log(string.Format("0 became 1", i++, i));
Console.WriteLine(i);
Console.ReadLine();
[Conditional("SKIP")]
private static void Log(string msg)
Console.WriteLine(msg);
如果未定义SKIP
,则此代码将打印出92
。如果定义了SKIP
,它将打印92 became 93
和93
。
【讨论】:
谢谢。问题:将 Log(string.Format("0 变成 1", i++, i));语句在汇编中编译?以上是关于编译器指令 - 建议 - 仅在调试模式下运行代码的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio c++ 仅在调试模式下 LNK 1104 错误