代码如下:
struct Foo {
Foo(const char *);
};
Foo::Foo(const char *str = 0)
{
}
Run Code Online (Sandbox Code Playgroud)
VS 2013和gcc 4.8.0接受这样的代码,而clang 3.3拒绝这样的代码:
错误:在重新声明时添加默认参数会使此构造函数成为默认构造函数
谁从标准(C++ 03和C++ 11)的观点来看是正确的?
注意:
我也喜欢clang的选择,但我会向gcc和visual studio报告bug,如果从标准的角度来看这不正确,这有助于说服编译器的开发人员解决这个问题.
GCC
我在这里描述了一个问题:http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 58194
但没有运气,他们暂停bug修复,直到草案成为标准.
我有类似的东西(真正的功能Ini::Section::get来自rusti ini):
impl Foo {
pub fn get<K>(&'a mut self, key: &K) -> Option<&'a str>
where
K: Hash + Eq,
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我必须多次打电话:
fn new() -> Result<Boo, String> {
let item1 = match section.get("item1") {
None => return Result::Err("no item1".to_string()),
Some(v) => v,
};
let item2 = match section.get("item2") {
None => return Result::Err("no item2".to_string()),
Some(v) => v,
};
}
Run Code Online (Sandbox Code Playgroud)
要删除代码膨胀,我可以像这样写一个宏:
macro_rules! try_ini_get {
($e:expr) => {
match $e {
Some(s) => s, …Run Code Online (Sandbox Code Playgroud) 在1.12 beta期间,我为Android构建并运行了这个代码而没有任何问题:
[package]
name = "android"
version = "0.1.0"
authors = ["Author <mail@email.com>"]
build = "build.rs"
[lib]
name = "mylib"
crate-type = ["cdylib"]
Run Code Online (Sandbox Code Playgroud)
我使用rustup和rustup target add arm-linux-androideabi.
现在,当我从Java代码加载Rust 1.12库时,我得到:
java.lang.UnsatisfiedLinkError:dlopen失败:找不到符号"rust_begin_unwind"
要暂时解决此问题,我需要一个解决方法:
#[allow(unused_variables)]
#[no_mangle]
pub extern
fn rust_begin_unwind(fmt: ::std::fmt::Arguments, file: &'static str, line: u32) -> ! {
loop {}
}
Run Code Online (Sandbox Code Playgroud)
我想从Java/Android调用Rust代码,我发现有3个变体:
JNI看起来很好而且功能强大,但是您必须手动编写太多代码.
JNA,如果不考虑它在我的机器上崩溃,需要手工编写Java结构数据类型描述,与JNR FFI相同的问题.
所以我不知道有多么困难将产生JNI代码traits,并struct与宏或编译器插件?此编译器应匹配具体结构的traits实现,以及struct
#[JNI]
struct Foo {
a: i32,
}
trait Boo {
fn f(&self, b: f64) -> f64;
}
#[JNI]
impl Boo for Foo {
fn f(&self, b: f64) -> f64 {
0f64
}
}
Run Code Online (Sandbox Code Playgroud)
并使用native函数为struct和Java类创建Java类,并生成pub no_mangle包含traits函数的函数.
我想使用android studio与ndkbuild集成.
我的"本机"部分只为armeabi-v7a-hard和x86构建,如果我只是ndk-build在jni目录中运行,那么一切正常.我有适当的路线Application.mk:
APP_ABI := armeabi-v7a-hard x86
Run Code Online (Sandbox Code Playgroud)
为了将项目集成到android studio中,我将这些行添加到build.gradle:
externalNativeBuild {
ndkBuild {
path 'src/lib/jni/Android.mk'
}
}
Run Code Online (Sandbox Code Playgroud)
但由于某些原因gradle build尝试使用APP_ABI=armeabi和构建本机代码,因为我的代码只能构建armeabi-v7a-hard.
所以,我怎么能告诉gradle这个建立我的代码只为armeabi-v7a-hard和x86,或者只是不能忽视APP_ABI来自行Application.mk?
我尝试这样的变种:
defaultConfig {
ndk {
abiFilters 'x86', 'armeabi-v7a-hard'
}
}
Run Code Online (Sandbox Code Playgroud)
但是gradle失败了这样的消息:
ABI [armeabi-v7a-hard]不适用于平台,不包括在建筑和包装中.可用的ABI是[armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,mips,mips64].
请注意,我用NDK 10,没有持续一(NDK 13),那里有armeabi-v7a-hard,并且ndk.dir在local.properties以正确的价值.
找出相同代码的货物构建后:虚假的编译时错误?,我想知道如何防止这样的问题:
$ cargo new feature_merge
$ cargo add nmea
$ cargo check > /dev/null 2>&1 && echo "success"
success
$ cargo add cexpr
$ cargo check > /dev/null 2>&1 || echo "failed"
failed
$ cargo rm cexpr && cargo check > /dev/null 2>&1 && echo "success"
success
Run Code Online (Sandbox Code Playgroud)
我删除/添加依赖项而不进行任何代码修改,这会影响构建结果.
正如我所描述的那样,问题的根源是cexpr依赖于这样的nom:
nom = {version = "^3", features = ["verbose-errors"] }
Run Code Online (Sandbox Code Playgroud)
而nmea描述了这样的依赖:
nom = "3.1.0"
Run Code Online (Sandbox Code Playgroud)
只有nmea作为依赖,Cargo使用一组功能构建nom,而Cargo使用另一组功能构建cexpr和nmea.
我想要一种方法来防止我维护的nmea箱子的错误使用.
我想像编译时错误一样"`nom` compiled with wrong features",或强迫Cargo构建两个nom变种.
我试过这样的事nmea/Cargo.toml …
我尝试这么简单的代码:
#include <cstdio>
#include <string>
int main()
{
const std::string s = std::string("a") + "b";
puts(s.c_str());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望编译器(gcc 4.8.2/clang 3.5.0)优化这样的代码
int main()
{
puts("ab");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但我无法得到这样的结果,我尝试了不同的选项,如"-Ofast"," - flto"," - static-libstdc ++",但总是在反汇编输出中看到三个函数调用:
...
callq 0x4017e0 <_ZNSsC2EPKcRKSaIcE>
...
callq 0x401690 <_ZNSs6appendEPKc>
...
callq 0x401490 <_ZNSs4_Rep10_M_disposeERKSaIcE>
Run Code Online (Sandbox Code Playgroud)
第一个是调用std :: basic_string,std :: allocator> :: basic_string(char const*,std :: allocator const&).
那么任何编译器都可以将这些代码优化为put("ab"); 或至少"std :: string s("ab");"?
如果没有这样的编译器,是什么使这种优化难以实现?
更新 关于实际使用情况.我在实际代码中看到/看到了许多具有这种模式的地方:
std::string s = std::string(string_const1) + string_const2 + string_variable + string_const3;
Run Code Online (Sandbox Code Playgroud)
如果性能很重要,当然可以以更优化的方式重写这些代码.
但现代编译器可以很好地完成代码优化.例如,gcc具有malloc/free/strcpy/strcat的__builtin函数,依此类推.如果来自gcc的libstdc ++的std :: …
是否有任何通用规则,设计文档或类似的东西解释了Rust标准库如何处理未生成的线程std::thread?
我有一个cdylib箱子,并希望以螺纹方式从另一种语言中使用它:
use std::mem;
use std::sync::{Arc, Mutex};
use std::thread;
type jlong = usize;
type SharedData = Arc<Mutex<u32>>;
struct Foo {
data: SharedData,
}
#[no_mangle]
pub fn Java_com_example_Foo_init(shared_data: &SharedData) -> jlong {
let this = Box::into_raw(Box::new(Foo { data: shared_data.clone() }));
this as jlong
}
#[cfg(target_pointer_width = "32")]
unsafe fn jlong_to_pointer<T>(val: jlong) -> *mut T {
mem::transmute::<u32, *mut T>(val as u32)
}
#[cfg(target_pointer_width = "64")]
unsafe fn jlong_to_pointer<T>(val: jlong) -> *mut T {
mem::transmute::<jlong, *mut T>(val)
}
#[no_mangle] …Run Code Online (Sandbox Code Playgroud) 在我的 CMakeLists.txt 中,我有这样的内容:
set_property(TEST testX APPEND PROPERTY DEPENDS testY)
set_property(TEST testX APPEND PROPERTY DEPENDS testZ)
Run Code Online (Sandbox Code Playgroud)
我想要某种方式来testX自动运行及其所有依赖项。就像是:
ctest <options> testX
Run Code Online (Sandbox Code Playgroud)
结果,CTest 将运行textY、testZ和testX。有什么办法可以做到这一点吗?
或者,如果现在不可能,是否有任何方法可以通过脚本从 CMake 构建目录中提取有关依赖项的信息?
我知道,编译器可以直接运行arm-linux-androideabi,但Android模拟器(我的意思是在x86/AMD64 ARM的仿真)是缓慢的,所以我不想使用cargo,并rustc在模拟器上,我只希望在其上运行测试.
我想我的电脑(上交叉编译测试cargo test --target=arm-linux-androideabi --no-run?),然后上传并在模拟器上运行他们,希望能赶上像虫子此.
如何在cargo test不运行的情况下运行cargo test?它是否像运行所有使用的二进制文件一样简单cargo test --no-run?
rust ×6
c++ ×3
gcc ×2
rust-cargo ×2
abi ×1
android ×1
android-ndk ×1
arm ×1
c ×1
c++11 ×1
clang ×1
clang++ ×1
cmake ×1
ctest ×1
java ×1
jna ×1
rust-crates ×1
string ×1
testing ×1
visual-c++ ×1