标签: conditional-compilation

使用Xcode中的MACOSX_DEPLOYMENT_TARGET为Cocoa应用程序进行条件编译

在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.)

我究竟做错了什么?我必须条件编译的一些基本的误解?

macos xcode cocoa conditional-compilation

7
推荐指数
1
解决办法
5674
查看次数

依赖#defines的最佳实践?

是否有支持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)

c c++ conditional-compilation c-preprocessor

7
推荐指数
1
解决办法
814
查看次数

在Eclipse中构建多SDK Android应用程序,而不会丢失编译时检查

我正在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尝试构建要多得多.

java eclipse compatibility android conditional-compilation

7
推荐指数
1
解决办法
2391
查看次数

包中是否包含条件表达式?

请考虑以下代码段:

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

7
推荐指数
2
解决办法
870
查看次数

使用ARC时的条件编译

有没有办法询问编译器是否打开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

7
推荐指数
1
解决办法
593
查看次数

#define指令目的

在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年并且没有意愿去做,但是我得到了一个支持项目,它有很多奇怪的定义,甚至以奇怪的方式命名.这些定义通常放在文件的顶部,就像我在这里的第一个例子.我不知道如何维护这段代码.

c# conditional-compilation c-preprocessor

7
推荐指数
1
解决办法
733
查看次数

什么时候在dxvahd.h中#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)Microsoft头文件变为true

嗨,我有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

7
推荐指数
1
解决办法
1万
查看次数

我可以在一个单元中定义条件并在其他单元中使用它们吗?

我在一个大型单位工作,单位变得如此之大,我决定将它分成3个单位.比方说,这些单位名称Main,CommonObjects.该Main装置使用其他两个装置,该Objects装置也使用该Common装置.所有3个单元中都有代码需要参考这些条件.

问题是,无论我定义这些条件的3个单元中的哪个单元,其他2个单元都看不到它们.我当然不想在所有3个单元中复制它们.我也不想在项目中定义它们,因为这些单元将被多个项目使用,在这种情况下,使用它的所有项目都不应该关心条件.

我能否以所有3个单位都能看到它们的方式定义这些条件,而不在项目中定义它们?

delphi conditional-compilation delphi-units delphi-xe2

7
推荐指数
1
解决办法
638
查看次数

如何在运行时检测某些编译器选项(如断言)是否设置为ON?

检查断言是否在Delphi中处于活动状态的条件是什么?

当代码中的断言不活动时,我希望能够做一些事情来抑制有关未使用变量的提示

procedure Whatever;
var
   v : Integer;
begin
   v := DoSomething;
   Assert(v >= 0);
end;
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,当断言未激活时,会有一个关于变量v被赋予从未使用的值的提示.

代码在一个将在各种环境中使用的库中,因此我能够专门测试断言,而不是像DEBUG那样的自定义条件.

delphi assert runtime conditional-compilation

7
推荐指数
1
解决办法
681
查看次数

如何在xml格式的resx文件中添加条件编译?

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

6
推荐指数
1
解决办法
423
查看次数