我正在尝试设置一个 pro 文件,如果定义了变量,我希望它仅包含特定的库。我已经通过命令行附加 DEFINES+=VARIABLE_NAME 将该变量传递到 qmake 中。
我可以使用 VARIABLE_NAME 有条件地编译部分代码,但是我可以有一个条件来检测 pro 文件中的 VARIABLE_NAME 并仅包含一个库(如果存在)吗?
谢谢,艾伦
是否可以将某些包含标记为仅包含在相关操作系统中?
例如,您可以执行以下操作:
#[cfg(unix)] {
use std::os::unix::io::IntoRawFd;
}
#[cfg(windows)] {
// https://doc.rust-lang.org/std/os/unix/io/trait.AsRawFd.html suggests this is equivalent?
use std::os::windows::io::AsRawHandle;
}
Run Code Online (Sandbox Code Playgroud)
试图编译上面的代码给了我语法错误(即error: expected item after attributes)。
我正在尝试修补我在 GitHub 上找到的 Rust 项目以在 Windows 上编译(同时仍然使其保留在其现有目标上编译的能力 - 即 Unixes 和 WASM)。目前我遇到了一个问题,其中一些文件从std::os(例如use std::os::unix::io::IntoRawFd;)导入特定于平台的部分,这最终破坏了 Windows 上的构建。
注意:我正在使用 Rust Stable (1.31.1) 而不是每晚使用。
据我对Rust 文档的最佳理解,属性仅应用于直接跟随属性的行。所以,如果我想有条件地编译一行,我可以这样做:
#[cfg(target_family = "unix")]
use termion::{color, style};
Run Code Online (Sandbox Code Playgroud)
当我想有条件地编译两行时会发生什么?
#[cfg(target_family = "unix")]
use termion::{color, style};
#[cfg(target_family = "unix")]
use termion::screen::*;
Run Code Online (Sandbox Code Playgroud)
有没有更干净的方法来做到这一点?
在我的 crate 中有几种方法可以做一些事情,有些可以快速执行,有些二进制大小很小,有些还有其他优点,所以我为所有这些都提供了用户界面。未使用的函数将被编译器优化掉。我的 crate 中的内部函数也必须使用这些接口,我希望它们在编译时尊重用户的选择。
有条件编译属性,如target_os,它存储一个值,如linux或windows。例如prefer_method,我如何创建这样的属性,以便我和用户可以像在以下代码片段中一样使用它?
我的箱子:
#[cfg(not(any(
not(prefer_method),
prefer_method = "fast",
prefer_method = "small"
)))]
compile_error("invalid `prefer_method` value");
pub fn bla() {
#[cfg(prefer_method = "fast")]
foo_fast();
#[cfg(prefer_method = "small")]
foo_small();
#[cfg(not(prefer_method))]
foo_default();
}
pub fn foo_fast() {
// Fast execution.
}
pub fn foo_small() {
// Small binary file.
}
pub fn foo_default() {
// Medium size, medium fast.
}
Run Code Online (Sandbox Code Playgroud)
用户箱:
#[prefer_method = "small"]
extern crate my_crate;
fn f() {
// …Run Code Online (Sandbox Code Playgroud) 之间有区别吗:
#if defined(_WIN32) || defined(_WIN64)
Run Code Online (Sandbox Code Playgroud)
和:
#ifdef _WINDOWS_
Run Code Online (Sandbox Code Playgroud)
defined() 我知道当有超过1个条件时有必要使用。
当尝试编写或解释cfg诸如以下之类的语句时
#[cfg(all(unix, not(target_arch = "wasm32")))]
Run Code Online (Sandbox Code Playgroud)
从atty板条箱中,我有时不确定unix这里到底意味着什么。(显然它包括wasm?)
是否有 rust 编译器目标属于哪个目标系列的完整列表?
rust 参考资料中的 cfg 文档似乎没有。
在C++中,我知道程序员#ifdef 0用来阻止代码运行,但在同一个项目中,我看到了很多#ifdef 1.这是否意味着代码总是运行?不幸的是代码没有编译所以我不能只运行和测试!
c++ macros conditional-compilation c-preprocessor preprocessor-directive
我正在开发一个符合ansi标准的编译器(Microchip XC8)上的PIC MCU程序.有两种操作模式,在编译期间通过宏确定.所以我不想因为一行代码而复制一个类似函数的宏,我想知道是否有任何方法可以编写宏如
#define FOO //
Run Code Online (Sandbox Code Playgroud)
这样当FOO被替换时,它实际上将取消该线的其余部分.
编写函数而不是宏是不可能的,因为函数调用产生的延迟会破坏程序的紧密时序(大约几微秒).
因此,我使用了一些属性,然后我意识到拥有一个取决于我是否在调试或发行版中使用的属性可能对我有所帮助。
事实证明,我无法通过搜索google或堆栈溢出找到所需的内容。有一个名为[Conditional]的属性,有一个[DebuggerDisplay],但我找不到一个将属性本身设置为条件的属性。
以下链接说明了[Conditional] vs #if Debug #if DEBUG vs. Conditional(“ DEBUG”)
我要寻找的只是更接近于属性形式。
#if DEBUG
[SomeAttribute(...)]
#endif
Run Code Online (Sandbox Code Playgroud)
我意识到我可以执行#define,然后使用正确的符号,这将使我不必再进行#if调试,但是我觉得应该有一个我不知道的属性标志。
如何使以下代码生效?
use strict;
use warnings;
if ($^O eq 'MSWin32' || $^O eq 'MSWin64') {
use Win32;
Win32::MsgBox("Aloha!", MB_ICONINFORMATION, 'Win32 Msgbox');
}
else {
print "Do not know how to do msgbox under UNIX!\n";
}
Run Code Online (Sandbox Code Playgroud)
以上在Windows下运行.但是在UNIX下,由于找不到Win32,因此存在编译错误.用"require"替换"use"会使事情变得更糟 - 代码无法在Windows和UNIX下编译,因为包含MB_ICONINFORMATION的行总是被编译而"MB_ICONINFORMATION"将是未声明的单词.
那么我该如何解决这个问题呢?
rust ×4
c++ ×3
macros ×3
attributes ×2
c ×1
c# ×1
compilation ×1
perl ×1
pic ×1
qmake ×1
qt ×1
rust-cargo ×1
syntax ×1
windows ×1