我需要我的代码根据编译它的操作系统做不同的事情.我正在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?有没有更好的方法来做同样的事情?
我想在Linux和Windows上运行一些c ++代码.有些代码我只希望包含在一个操作系统中,而不包含在另一个操作系统中.是否有标准的#ifdef可以使用?
就像是:
#ifdef LINUX_KEY_WORD
... // linux code goes here.
#elif WINDOWS_KEY_WORD
... // windows code goes here.
#else
#error "OS not supported!"
#endif
Run Code Online (Sandbox Code Playgroud)
问题确实是重复的,但这里的答案要好得多,尤其是被接受的答案.
我正在寻找一种方法可靠地确定C++代码是在32位还是64位编译.我们已经提出了我们认为使用宏的合理解决方案,但很想知道人们是否可以想到这可能会失败的情况,或者是否有更好的方法来做到这一点.请注意,我们正在尝试在跨平台的多编译器环境中执行此操作.
#if ((ULONG_MAX) == (UINT_MAX))
# define IS32BIT
#else
# define IS64BIT
#endif
#ifdef IS64BIT
DoMy64BitOperation()
#else
DoMy32BitOperation()
#endif
Run Code Online (Sandbox Code Playgroud)
谢谢.
可能重复:
.NET Debug/Release差异中的调试与发布
构建项目时Visual Studio中的Release和Debug模式有什么区别?
我怀疑是否有一种方法可以在Java中创建编译时条件,如C++中的#ifdef #ifndef.
我的问题是有一个用Java编写的算法,我有不同的运行时间改进了该算法.所以我想测量每次改进时我节省了多少时间.
现在我有一组布尔变量,用于在运行时决定应该使用哪些改进,哪些不使用.但即使测试这些变量也会影响总运行时间.
所以我想找到一种方法来在编译期间决定编译和使用程序的哪些部分.
有人知道在Java中使用它的方法.或者也许有人知道没有这样的方式(它也会有用).
在C++中,是这样的:
#ifdef A && B
Run Code Online (Sandbox Code Playgroud)
同样如下:
#if defined(A) && defined(B)
Run Code Online (Sandbox Code Playgroud)
?
我当时认为它不是,但我无法找到与我的编译器(VS2005)的差异.
考虑以下类:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我们以这种方式调用方法:
var a = new A();
var b = a.GetB();
b.Hello();
Run Code Online (Sandbox Code Playgroud)
在发布版本中(即没有DEBUG标志),我们只会GetB在控制台上看到打印,因为Hello()编译器会忽略调用.在调试版本中,两个打印都会出现.
现在让我们链接方法调用:
a.GetB().Hello();
Run Code Online (Sandbox Code Playgroud)
调试版本中的行为保持不变; 但是,如果未设置标志,我们会得到不同的结果:两个调用都被省略,并且控制台上没有打印.快速浏览一下IL可以看出整行都没有编译过.
根据C#的最新ECMA标准(ECMA-334,即C#5.0),将Conditional属性放置在方法上时的预期行为如下(强调我的):
如果在呼叫点定义了一个或多个相关的条件编译符号,则包括对条件方法的调用,否则省略该调用.(§22.5.3)
这似乎并不表示整个链应该被忽略,因此我的问题.话虽如此,微软的C#6.0草案规范提供了更多细节:
如果定义了符号,则包括呼叫; 否则,省略呼叫(包括接收机的评估和呼叫的参数).
没有评估调用参数的事实已被充分记录,因为这是人们使用此功能而不是#if函数体中的指令的原因之一.然而,关于"接收器的评估"的部分是新的 - 我似乎无法在其他地方找到它,它似乎解释了上述行为.
鉴于此,我的问题是:在这种情况下,C#编译器没有评估的理由 是什么a.GetB() ? …
我正在编写一些半便携式代码,并希望能够检测我何时编译iPhone.所以我想要类似的东西#ifdef IPHONE_SDK....
据推测,Xcode定义了一些东西,但我在项目属性下看不到任何东西,谷歌也没什么帮助.
C#有一个没有 Conditional(!Conditional,NotConditional,Conditional(!))属性?
我知道C#有一个Conditional属性:
[Conditional("ShowDebugString")]
public static void ShowDebugString(string s)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这相当于1:
public static void ShowDebugString(string s)
{
#if ShowDebugString
...
#endif
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我想要反向行为(你必须明确选择退出):
public static void ShowDebugString(string s)
{
#if !RemoveSDS
...
#endif
}
Run Code Online (Sandbox Code Playgroud)
这让我尝试:
[!Conditional("RemoveSDS")]
public static void ShowDebugString(string s)
{
...
}
Run Code Online (Sandbox Code Playgroud)
哪个不编译.和:
[Conditional("!RemoveSDS")]
public static void ShowDebugString(string s)
{
...
}
Run Code Online (Sandbox Code Playgroud)
哪个不编译.和:
[NotConditional("RemoveSDS")]
public static void ShowDebugString(string s) …Run Code Online (Sandbox Code Playgroud) 我的项目需要Java 1.6进行编译和运行.现在我需要使用Java 1.5(来自营销方面).我想替换方法体(返回类型和参数保持不变),以使其使用Java 1.5进行编译而不会出现错误.
详细信息:我有一个实用程序类OS,它封装了所有特定于操作系统的东西.它有一种方法
public static void openFile(java.io.File file) throws java.io.IOException {
// open the file using java.awt.Desktop
...
}
Run Code Online (Sandbox Code Playgroud)
打开文件,如双击(startWindows命令或openMac OS X命令等效).由于无法使用Java 1.5进行编译,因此我希望在编译期间将其排除,并替换为另一种调用run32dllWindows或openMac OS X的方法Runtime.exec.
问题:我该怎么办?注释可以帮到这里吗?
注意:我使用ant,我可以制作两个java文件OS4J5.java,OS4J6.java它们将包含OS带有Java 1.5和1.6所需代码的类,并OS.java在编译之前复制其中一个(或者一种丑陋的方式 - OS.java根据java有条件地替换内容如果有另一种方式,我不想这样做.
详细说明:在CI中可以使用ifdef, ifndef,在Python中没有编译,我可以hasattr在Common Lisp中使用或其他东西检查功能,我可以使用#+feature.Java有类似的东西吗?
发现这篇文章,但它似乎没有帮助.
任何帮助是极大的赞赏.KH.
c++ ×3
c# ×2
conditional ×2
java ×2
32bit-64bit ×1
c ×1
compilation ×1
ifdefine ×1
ios ×1
linux ×1
macos ×1
windows ×1
xcode ×1