标签: conditional-compilation

Android 中的 #ifdef

我正在为 Android 编写一个应用程序。我的应用程序必须在Android 2.2和Android 4.0.3下启动,我想在Android中使用类似#ifdef的东西,但我仍然找不到方法。

代码示例

安卓4.0.3

if( android.os.Build.VERSION.SDK == 4.0.3)
{
    String str = "foo";
    boolean b = str.isEmpty();
}
Run Code Online (Sandbox Code Playgroud)

安卓2.2

else {
    String str = "foo";
    boolean b = str.length() == 0;
}
Run Code Online (Sandbox Code Playgroud)

我不能编写这样的代码,因为编译器会给出错误。

你可以建议我做什么?

java android conditional-compilation

2
推荐指数
1
解决办法
4150
查看次数

如何设置 cfg 选项以有条件地编译?

我正在处理一些代码,其中缓冲区由静态大小的数组支持。由于 Rust 和它提供的构建工具提供了有条件编译的可能性,我可以这样做:

struct Buffer {
    // default case, if none is set
    #[cfg(not(buffersize))]
    buffer: [f32; 16],

    #[cfg(buffersize = "32")]
    buffer: [f32; 32],

    #[cfg(buffersize = "64")]
    buffer: [f32; 64],
}

impl Buffer {
    fn new() -> Buffer {
        Buffer {
            #[cfg(not(buffersize))]
            buffer: [0.0; 16],

            #[cfg(buffersize = "32")]
            buffer: [0.0; 32],

            #[cfg(buffersize = "64")]
            buffer: [0.0; 64],
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个问题是使用特性有条件地编译代码。单独使用功能,我必须结合buffersize实际值,例如buffersize16. 是否可以将cfg标志提供给 Cargo,或者我是否需要直接将它们提供给rustc

conditional-compilation rust

2
推荐指数
1
解决办法
1690
查看次数

在“cfg”宏下使用条件编译模块

我想知道如何在宏下使用条件编译模块cfg!。我正在尝试这个:

pub fn f() { ... }

#[cfg(feature = "x")]
pub mod xmodule {
   pub fn f() { ... }
}

pub fn test() {
  if cfg!(feature = "x") {
    xmodule::f();
  } else {
    f();
  }; 
}
Run Code Online (Sandbox Code Playgroud)

当我使用 编译它时它工作正常cargo check --features x,但如果我不启用该功能,它会失败并出现以下错误:

use of undeclared type or module `xmodule`
Run Code Online (Sandbox Code Playgroud)

我是否做错了什么,或者编译不够智能,无法理解如果未设置该功能则不应使用该模块?

conditional-compilation rust

2
推荐指数
1
解决办法
1317
查看次数

Oracle PL/SQL 条件声明?

我们可以在 pl/sql 函数或过程中对变量进行条件声明吗?例如,我们可以执行以下操作:

CREATE OR REPLACE FUNCTION get_total_sales(
    in_year PLS_INTEGER
) 
RETURN NUMBER
IS
    IF condtion THEN
       variable_name_1 BINARY_FLOAT;
    ELSE
       variable_name_2 NUMBER;
    END;

BEGIN
   --- Function Logic
END;
Run Code Online (Sandbox Code Playgroud)

如果condition满足,我需要声明一个名为的变量variable_name_1,如果不是,我不想声明它,而是需要声明一个名为variable_name_2.

database oracle plsql stored-procedures conditional-compilation

2
推荐指数
1
解决办法
122
查看次数

访问构建脚本*内部*的 Cargo 功能

如何在 build.rs 脚本中访问正在构建的包的哪些功能?脚本中有一个非常昂贵的步骤,仅需要特定的货物功能,但我看不到任何方法来访问构建脚本内的配置功能。

有什么方法可以读取 build.rs 脚本中是否启用了给定功能?

conditional-compilation rust-cargo

2
推荐指数
1
解决办法
2189
查看次数

Rust:带有 lib 和二进制目标的板条箱中的属性 #[cfg(test)]

我目前正在研究一个Rust 项目,该项目有一个库目标和一个二进制目标。

该库定义了两种恐慌处理程序,一种用于生产使用,另一种用于测试,它们使用 #[cfg(test)] 属性进行条件编译。这对于单元测试 src/lib.rs 来说效果很好,但是一旦在tests/(或 src/main.rs)中进行集成测试,“生产”恐慌处理程序就会被链接到,即在这些情况下,lib。 rs 使用 test=false 进行编译。

有什么方法可以防止/配置它吗?

使用以下目录结构可以最低程度地重现这一点:

Cargo.toml
src/lib.rs
src/main.rs
Run Code Online (Sandbox Code Playgroud)

清单如下所示:

# Cargo.toml
...
[lib]
name = "kernel"

[[bin]]
path = "src/main.rs"
name = "titanium"
Run Code Online (Sandbox Code Playgroud)

二进制代码:

// main.rs

fn main() {
    println!("Hello, world!");
}

#[test]
fn it_works() {
    assert_eq!(kernel::hello(), "Hello!".to_string());
}
Run Code Online (Sandbox Code Playgroud)

...对于图书馆:

// lib.rs

#[cfg(test)]
pub fn hello() -> String {
    "Hello!".to_string()
}

#[cfg(not(test))]
pub fn hello() -> String {
    "Goodbye!".to_string()
}

#[test]
fn it_works() {
    assert_eq!(hello(), "Hello!".to_string())
}
Run Code Online (Sandbox Code Playgroud)

回答 事实上,上述行为对于大约 …

testing conditional-compilation rust rust-cargo

2
推荐指数
1
解决办法
1520
查看次数

将 C 识别的指针类型定义为内部 C++ 类

我有一个类想要在 C 和 C++ 之间共享,其中 C 只能将其作为指针获取。然而,因为它是一个内部类,所以不能向前声明。相反,这就是我们当前的代码在公共头文件中所做的事情:

#ifdef __cplusplus
class Container {
public:
    class Object {
        public:
        int x;
    };
};

typedef Container::Object * PObject;
#else

typedef void* PObject;

#endif
Run Code Online (Sandbox Code Playgroud)

这看起来违反了单一定义规则 (ODR),因为 C 和 C++ 使用#ifdef. 但因为这是一个指针,所以我不确定这是否会产生真正的问题。C 仅使用指针将其传递给 C++ 函数,它不会直接用它执行任何操作。例如公共头文件中的这段代码:

#ifdef __cplusplus
extern "C" {
#endif
int object_GetX(PObject pObject);

#ifdef __cplusplus
}
#endif /* __cplusplus */
Run Code Online (Sandbox Code Playgroud)

这就是我们在 C++ 文件中实现它的方式:

int object_GetX(PObject pObject) {
    return pObject->x;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 像这样违反 ODR 会造成任何实际问题吗?
  2. 如果是这样,是否有另一种方便的方法将类共享给C?

c c++ conditional-compilation inner-classes one-definition-rule

2
推荐指数
1
解决办法
107
查看次数

如何在设置标志时将代码包含到构建中?

我已经在我的应用程序中添加了一些调试代码,我只想在需要时调用它.我记得有一些IFDEF可以用来有条件地将代码包含在源文件中.

例如,我可能有这样的事情:

IFDEF kDebugEnabled == YES {
    // some debugging code here
}
Run Code Online (Sandbox Code Playgroud)

然后,如果kDebugEnabled为YES,则只将这段代码编译成二进制文件.

我怎么能这样做?

请注意:我不想使用项目编译器标志设置.我只是想定义一个BOOL(或者同样有用的东西),这是真或假,然后只需在我的App Delegate中轻松设置它.我发现很难导航到项目编译器设置,搜索标志然后设置它.我知道有一个可能有用的Debug标志.

iphone objective-c conditional-compilation ipad ios

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

在objective-c中,当使用#define和#if时,使用YES/NO的替代方法是什么

由于定义了YES/NO的方式,您不能使用YES/NO #if,例如,#define CAN_DO YES这表示由标签CAN_DO控制的代码应该通常使用"打开" #if CAN_DO.作为一个老学校的C家伙,我会用,#define CAN_DO 1但觉得它不是'Objective-C like'.有没有首选的'目标-C'方式来做到这一点?(顺便说一句,我知道#ifdef但是那些使用标签的人最好通过提供#defined'd符号)来服务.

更简单地说,我希望那些将在"用户"代码中设置符号的人能够说出类似的内容#define SOME_SYMBOL YES.但是我认为C方式#define SOME_SYMBOL 1和它一样好.

objective-c conditional-compilation

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

C#条件编译中是否存在OR运算符?

我目前正在构建一个.NET程序集,该程序应在.NET 4.5和至少两个.NET Core版本(.NET Core 2.1和.NET Core 3.0)中工作。

我正在使用条件编译,如下所示:

#if NET45
        //Use as System.Web.HttpContext
        isHttps = context.Request.IsSecureConnection;
        IPAddress fromIp = IPAddress.Parse(context.Request.UserHostAddress);
        string path = context.Request.Path;
#elif NETCOREAPP2_1
        //Use as Microsoft.AspNetCore.Http.HttpContext
        isHttps = context.Request.IsHttps;
        IPAddress fromIp = context.Request.HttpContext.Request.HttpContext.Connection.RemoteIpAddress;
        string path = context.Request.Path;
#elif NETCOREAPP3_0
        //Use as Microsoft.AspNetCore.Http.HttpContext
        isHttps = context.Request.IsHttps;
        IPAddress fromIp = context.Request.HttpContext.Request.HttpContext.Connection.RemoteIpAddress;
        string path = context.Request.Path;
#endif
Run Code Online (Sandbox Code Playgroud)

由于NETCOREAPP2_1和NETCOREAPP3_0的代码相同,所以我想知道我可以使用以下代码:

#if NET45
        //...
#elif NETCOREAPP2_1 [OR] NETCOREAPP3_0
        //...
#endif    
Run Code Online (Sandbox Code Playgroud)

但是,此语法不起作用。

在这样的条件编译中是否存在有效的语法来包含OR运算符?

注意:由于这涉及ASP.NET请求管道,因此我认为.NET Standard不是一个选择。您可能需要及时查看代码:https : //github.com/suterma/SqlSyringe/blob/f7df15e2c40a591b8cea24389a1ba8282eb02f6c/SqlSyringe/Syringe.cs

.net c# conditional-compilation .net-core

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