在Cocoa应用程序中,我想使用条件编译,如:
#if MACOSX_DEPLOYMENT_TARGET <= MAC_OS_X_VERSION_10_4
[[NSFileManager defaultManager] removeFileAtPath:path handler:nil];
#else
[[NSFileManager defaultManager] removeItemAtPath:path error:NULL];
#endif
Run Code Online (Sandbox Code Playgroud)
我的希望是,这将避免对removeFileAtPath编译器警告:当MACOSX_DEPLOYMENT_TARGET = 10.6,因为它不应该编译该行被弃用.
它不起作用.
当MACOSX_DEPLOYMENT_TARGET = 10.6时,我收到一条警告,表示不推荐使用removeFileAtPath:.但它不应该编译那一行,所以它不应该警告它有一个弃用的方法!
(我在项目构建设置和目标构建设置中都设置了MACOSX_DEPLOYMENT_TARGET.我将BASE_SDK设置为10.6,并在两者中指定GCC 4.2.)
我究竟做错了什么?我必须条件编译的一些基本的误解?
是否有支持C/C++预处理程序标志依赖性的最佳实践-DCOMPILE_WITHOUT_FOO?这是我的问题:
> setenv COMPILE_WITHOUT_FOO
> make <Make system reads environment, sets -DCOMPILE_WITHOUT_FOO>
<Compiles nothing, since no source file has changed>
Run Code Online (Sandbox Code Playgroud)
我想要做的是让所有依赖#ifdef语句的文件重新编译:
> setenv COMPILE_WITHOUT_FOO
> make
g++ FileWithIfdefFoo.cpp
Run Code Online (Sandbox Code Playgroud)
如果COMPILE_WITHOUT_FOO的值没有改变,我不想要重新编译所有内容.
我有一个原始的Python脚本工作(见下文)基本上写一个头文件FooDefines.h,然后差异它,看看是否有任何不同.如果是,则替换FooDefines.h,然后传统的源文件依赖性接管.定义不会在命令行上传递-D.缺点是我现在必须包含FooDefines.h在任何使用该文件的源文件中#ifdef,并且我还有一个新的动态生成的头文件#ifdef.如果有一个工具可以做到这一点,或者是一种避免使用预处理器的方法,我会全力以赴.
import os, sys
def makeDefineFile(filename, text):
tmpDefineFile = "/tmp/%s%s"%(os.getenv("USER"),filename) #Use os.tempnam?
existingDefineFile = filename
output = open(tmpDefineFile,'w')
output.write(text)
output.close()
status = os.system("diff -q %s %s"%(tmpDefineFile, existingDefineFile))
def checkStatus(status):
failed = False
if …Run Code Online (Sandbox Code Playgroud) 我正在Eclipse中开发一个Android应用程序.我想针对各种设备和SDK版本(例如,我可以选择支持多点触控).我理解推荐的方法将所有新功能隔离到单独的类,并利用延迟加载仅在运行时加载该类,如果主机设备实际支持该功能.
这种方法的缺点是我必须使用我想要使用的最新功能的SDK编译我的所有代码.这意味着如果某些新功能泄漏到我的"版本中立"代码中,编译器就无法再捕获它.
我希望在Eclipse中能够针对较旧的Android SDK编译我的项目,以确保我的"版本中立"代码没问题.如果可能的话,我想避免将我的构建系统移出Eclipse.我很好,这个旧的SDK构建运行起来有点尴尬.
我认为这归结为在Eclipse中做一些有条件的补充(或条件"链接")?例如,在我针对SDK-1.6构建的项目中,我想将"MultiTouchHandler.java"源保留在构建之外.我不确定是否有可能在Eclipse中表达这样的"构建类型".
hacky解决方案似乎只是手动更改项目的SDK版本,重建和查看错误,并忽略"预期"错误.矫枉过正的解决方案似乎是编写我自己的ant/maven/make构建脚本.
这个问题: Eclipse的版本控制和通用代码库 涵盖了类似的基础,但涉及将所有特定于版本的类移动到单独的"库"中.(我认为,我仍然会遇到Eclipse中多种构建类型的问题.)
这个问题: 使用eclipse构建多个项目配置意味着我应该转移到外部构建系统(如ant或maven),但这比仅使用旧SDK尝试构建要多得多.
请考虑以下代码段:
requires
designide,
rtl,
vcl,
{$IF RTLVersion < 19.0} // E2026 Constant expression expected
//{$IF CompilerVersion = 22.0} // same as above
vcljpg;
{$ELSE}
vclimg;
{$IFEND}
Run Code Online (Sandbox Code Playgroud)
它似乎在语法上是正确的.但是,编译器会对其进行扼流并报告Constant expression expected.这里到底发生了什么?
技术:目前仅在XE(15.0.3953.35171)上测试过.
当然,也欢迎变通方法的建议.
delphi compiler-construction conditional-compilation conditional-expressions delphi-xe
有没有办法询问编译器是否打开ARC,然后根据该值有条件地编译?例如,我有一个协议:
@protocol ProtocolA
@required
-(void)protocolMethodOne
@optional
-(void)protocolMethodTwo;
@end
Run Code Online (Sandbox Code Playgroud)
如果我使用ARC,我想protocolMethodA在使用ARC时可选,并且在不使用ARC时需要.这是因为使用此方法的主要原因之一是取消分配对象实例.
话虽如此,这就是我想要发生的事情:
@protocol ProtocolA
#ifdef SOME_ARC_VARIABLE
@optional
#else
@required
#endif
-(void)protocolMethodOne
@optional
-(void)protocolMethodTwo;
@end
Run Code Online (Sandbox Code Playgroud) iphone objective-c conditional-compilation automatic-ref-counting
在C#中#define指令的目的和用法是什么?
关于这个主题的问题已经很少了,但我没有答案.他们只举例说明它的工作原理.但我需要更深入的解释:它为什么存在以及使用它的好方法(如果有的话).
基本上我知道如何使用它,但对我来说,用法看起来很奇怪.我们来看看例子:
#define DEV
#if DEV
Console.WriteLine("Development trace log message");
#endif
Run Code Online (Sandbox Code Playgroud)
对我来说,这与使用项目定义的条件编译符号的#if条件构建完全不同.如果我们使用项目定义的符号,它将附加到项目构建配置,我们可以使用构建配置来管理构建(并从构建中排除)所需的代码.所以代码
#if DEBUG
Console.WriteLine("Debug log message");
#endif
Run Code Online (Sandbox Code Playgroud)
对我来说没问题.但正如我所说,它与使用#define指令完全不同,因为它是可管理的. 我是否正确,第一个示例只能在每次构建时手动注释/取消注释#define行?如果是的话,它是不可管理的,难以维护的,我认为#define的这种用法是极其不好的做法,并且根本不存在于语言中.
我可以想象在#if语句中使用#define/#undef.就像是
#if DEBUG
#if CLIENT1
#define TEST_CLIENT1
#endif
#endif
#if TEST_CLIENT1
connectionString = "Some specific test connection" //I know this is bad practice even in conditional. Only for example purpose.
#elif
//Read connection from config
#endif
#if UNITTESTS
#undef TEST_CLIENT1
#endif
#if TEST_CLIENT1
Console.WriteLine("Some message");
#endif
Run Code Online (Sandbox Code Playgroud)
很抱歉这么复杂的例子,但这至少是我觉得有用的东西.虽然我不会以任何方式编写这样的代码=). #define有什么用处吗?
PS:我自己从未使用#define 5年并且没有意愿去做,但是我得到了一个支持项目,它有很多奇怪的定义,甚至以奇怪的方式命名.这些定义通常放在文件的顶部,就像我在这里的第一个例子.我不知道如何维护这段代码.
嗨,我有2个VC++解决方案"A"和"B"(VS2008)都具有相同的代码库(只有几行代码不同).在两者中使用DXVAHD.h.
dxvahd.h是一个标准的Microsoft头文件.如果我们打开这个头文件,我们看到有一个条件,如果" #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)"
我在VC++解决方案"A"中看到,上面的条件#if语句为false,因此整个dxvahd头文件变灰并且甚至没有编译!
而在另一个解决方案"B"中,这个条件#if是真的,因此没有问题及其工作正常.
任何人都可以让我知道如何在解决方案"A"中解决此问题,其中上述#if变得灰色/不编译.PLZ帮帮我.
提前致谢.
c++ conditional conditional-compilation visual-c++ conditional-statements
我在一个大型单位工作,单位变得如此之大,我决定将它分成3个单位.比方说,这些单位名称Main,Common和Objects.该Main装置使用其他两个装置,该Objects装置也使用该Common装置.所有3个单元中都有代码需要参考这些条件.
问题是,无论我定义这些条件的3个单元中的哪个单元,其他2个单元都看不到它们.我当然不想在所有3个单元中复制它们.我也不想在项目中定义它们,因为这些单元将被多个项目使用,在这种情况下,使用它的所有项目都不应该关心条件.
我能否以所有3个单位都能看到它们的方式定义这些条件,而不在项目中定义它们?
检查断言是否在Delphi中处于活动状态的条件是什么?
当代码中的断言不活动时,我希望能够做一些事情来抑制有关未使用变量的提示
procedure Whatever;
var
v : Integer;
begin
v := DoSomething;
Assert(v >= 0);
end;
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,当断言未激活时,会有一个关于变量v被赋予从未使用的值的提示.
代码在一个将在各种环境中使用的库中,因此我能够专门测试断言,而不是像DEBUG那样的自定义条件.
NET项目,我需要根据某些编译符号在资源文件(这是一个xml文件)中添加内容.
类似以下内容:
<xml ....>
<myNodes>
#if SOMECONDITION
<node1>
...
</node1>
#else
<node2>
...
</node2>
#endif
</myNodes>
Run Code Online (Sandbox Code Playgroud)
这甚至可能吗?我知道这不符合XML规则.是否有类似的方法来使用条件编译并且还要遵守XML规则?
conditional-compilation visual-studio-2010 embedded-resource c#-4.0
delphi ×3
c++ ×2
android ×1
assert ×1
c ×1
c# ×1
c#-4.0 ×1
cocoa ×1
conditional ×1
delphi-units ×1
delphi-xe ×1
delphi-xe2 ×1
eclipse ×1
iphone ×1
java ×1
macos ×1
objective-c ×1
runtime ×1
visual-c++ ×1
xcode ×1