我最近研究了我的项目的开源代码,并遇到了以下代码。
internal ContentTypeReader[] LoadAssetReaders(ContentReader reader)
{
#pragma warning disable 0219, 0649
// Trick to prevent the linker removing the code, but not actually execute the code
if (falseflag)
{
// Dummy variables required for it to work on iDevices ** DO NOT DELETE **
// This forces the classes not to be optimized out when deploying to iDevices
var hByteReader = new ByteReader();
var hSByteReader = new SByteReader();
var hDateTimeReader = new DateTimeReader();
...
如果不执行该怎么办,编译器会中断代码吗?
有人可以更清楚地解释这一点吗
答案 0 :(得分:1)
@ Jan-Fokke if
上方的注释,里面的注释解释了为什么需要这样做。 #pragma warning disable 0219, 0649
的故障将抑制两个特定的警告:
CS0219是在声明变量但从未使用过时生成的。您可以通过创建未在任何地方使用的变量来轻松地在自己的代码中尝试此操作。在某些系统中,警告会破坏构建,并且如果您无法摆脱特定的警告,则可以选择禁止它。
CS0649我不确定为什么被触发(可能来自先前的迭代)警告将为: 编译器检测到从未初始化的私有或内部字段声明值。
所以第二条评论是,如果编译器找不到这些类的任何实例,它将在iDevices上摆脱它们。编译器优化策略通常非常复杂,通常当您看到这样的代码时-这意味着代码库背后的团队为此问题苦苦挣扎,并最终解决了这一问题。
请查看以下链接,以获取有关编译器优化和DCE(消除死代码)的更多信息
https://en.wikipedia.org/wiki/Dead_code_elimination https://www.mono-project.com/docs/about-mono/languages/csharp/#cil-optimizations
如果您想进一步搜索,以下内容来自Incredibuild常见问题解答:
Q :我正在使用与MSVC不同的编译器/链接器,以实现更好的代码优化。我仍然使用Visual Studio开发和构建项目。 IncrediBuild是否支持我正在使用的编译器?
A :IncrediBuild当前支持Microsoft的cl.exe(所有Visual Studio,eVC,Xbox和Xbox 360平台)和Intel C ++编译器。将来可能会支持其他编译器。 XGE Interfaces解决方案可以与各种构建工具和脚本一起使用,以运行当前不支持的编译器。