我正在为 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)
我不能编写这样的代码,因为编译器会给出错误。
你可以建议我做什么?
我正在处理一些代码,其中缓冲区由静态大小的数组支持。由于 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?
我想知道如何在宏下使用条件编译模块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)
我是否做错了什么,或者编译不够智能,无法理解如果未设置该功能则不应使用该模块?
我们可以在 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
如何在 build.rs 脚本中访问正在构建的包的哪些功能?脚本中有一个非常昂贵的步骤,仅需要特定的货物功能,但我看不到任何方法来访问构建脚本内的配置功能。
有什么方法可以读取 build.rs 脚本中是否启用了给定功能?
我目前正在研究一个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)
回答 事实上,上述行为对于大约 …
我有一个类想要在 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)
我的问题是:
c c++ conditional-compilation inner-classes one-definition-rule
我已经在我的应用程序中添加了一些调试代码,我只想在需要时调用它.我记得有一些IFDEF可以用来有条件地将代码包含在源文件中.
例如,我可能有这样的事情:
IFDEF kDebugEnabled == YES {
// some debugging code here
}
Run Code Online (Sandbox Code Playgroud)
然后,如果kDebugEnabled为YES,则只将这段代码编译成二进制文件.
我怎么能这样做?
请注意:我不想使用项目编译器标志设置.我只是想定义一个BOOL(或者同样有用的东西),这是真或假,然后只需在我的App Delegate中轻松设置它.我发现很难导航到项目编译器设置,搜索标志然后设置它.我知道有一个可能有用的Debug标志.
由于定义了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和它一样好.
我目前正在构建一个.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