Questions tagged «conditional-compilation»


15
在C ++中确定32位和64位
我正在寻找一种可靠地确定C ++代码是否以32位和64位编译的方法。我们已经提出了我们认为使用宏的合理解决方案,但是很想知道人们是否可以想到这种情况可能会失败,或者是否有更好的方法来做到这一点。请注意,我们正在尝试在跨平台的多编译器环境中执行此操作。 #if ((ULONG_MAX) == (UINT_MAX)) # define IS32BIT #else # define IS64BIT #endif #ifdef IS64BIT DoMy64BitOperation() #else DoMy32BitOperation() #endif 谢谢。

8
Java中的#ifdef #ifndef
我怀疑是否有一种方法可以在Java中创建编译时条件,例如C ++中的#ifdef #ifndef。 我的问题是,有一种用Java编写的算法,并且对该算法的运行时间有所不同。因此,我想衡量每次使用改进后可以节省多少时间。 现在,我有一组布尔变量,这些变量用于确定在运行时应使用哪个改进,而不是哪个改进。但是,即使测试这些变量也会影响总运行时间。 因此,我想找到一种方法来确定在编译期间应编译和使用程序的哪些部分。 有人知道用Java做到这一点的方法吗?或者,也许有人知道没有这种方法(这也很有用)。


3
当最后一个条件调用有条件时,为什么C#编译器会删除方法调用链?
考虑以下类别: public class A { public B GetB() { Console.WriteLine("GetB"); return new B(); } } public class B { [System.Diagnostics.Conditional("DEBUG")] public void Hello() { Console.WriteLine("Hello"); } } 现在,如果我们以这种方式调用方法: var a = new A(); var b = a.GetB(); b.Hello(); 在发布版本中(即,无DEBUG标志),我们只会看到GetB控制台上打印的内容,因为Hello()编译器会省略对的调用。在调试版本中,两个打印都会出现。 现在让我们链接方法调用: a.GetB().Hello(); 调试版本中的行为不变。但是,如果未设置标志,则会得到不同的结果:两个调用都被省略,并且控制台上没有打印内容。快速浏览一下IL会发现整个行没有被编译。 根据针对C#的最新ECMA标准(ECMA-334,即C#5.0),Conditional属性置于方法上如下(强调我的意思): 如果在调用点定义了一个或多个与其相关的条件编译符号,则包括对条件方法的调用,否则将省略该调用。(第22.5.3节) 这似乎并不表示应忽略整个链条,因此是我的问题。话虽如此,Microsoft的C#6.0规范草案提供了更多细节: 如果定义了该符号,则包括该呼叫;否则,将忽略该呼叫(包括对接收方的评估和该呼叫的参数)。 没有对调用的参数进行评估的事实有据可查,因为这是人们#if在功能体内使用此功能而不是使用伪指令的原因之一。但是,有关“接收者评估”的部分是新的-我似乎无法在其他地方找到它,并且确实可以解释上述行为。 有鉴于此,我的问题是:在这种情况下,C#编译器不进行评估的原理 是什么a.GetB() ?根据条件调用的接收者是否存储在临时变量中,它的行为是否真的有所不同?

7
C#!条件属性?
C#有一个不 Conditional(!Conditional,NotConditional,Conditional(!))属性? 我知道C#具有一个Conditional属性: [Conditional("ShowDebugString")] public static void ShowDebugString(string s) { ... } 等于1等于: public static void ShowDebugString(string s) { #if ShowDebugString ... #endif } 但是在这种情况下,我想要相反的行为(您必须专门选择退出): public static void ShowDebugString(string s) { #if !RemoveSDS ... #endif } 这使我尝试: [!Conditional("RemoveSDS")] public static void ShowDebugString(string s) { ... } 不会编译。和: [Conditional("!RemoveSDS")] public static …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.