小编fgh*_*ghj的帖子

默认参数,gcc vs clang

代码如下:

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修复,直到草案成为标准.

c++ gcc visual-c++ c++11 clang++

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

有没有办法在没有宏的情况下简化将选项转换为结果?

我有类似的东西(真正的功能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)

rust

14
推荐指数
2
解决办法
3664
查看次数

Rust_begin_unwind从Rust 1.11到1.12的变化是什么?

在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)
  1. 为什么在Android平台上无法解开?
  2. 如何正确解决这个问题?调试时,我希望在Android IDE日志窗口中看到完整的堆栈跟踪.

rust

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

如何为Rust代码自动化Java绑定?

我想从Java/Android调用Rust代码,我发现有3个变体:

  1. JNI
  2. JNA
  3. JNR FFI

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函数的函数.

java java-native-interface jna rust

10
推荐指数
2
解决办法
1083
查看次数

gradle + ndkbuild + android studio 2.2如何设置支持的ABI?

我想使用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-hardx86,或者只是不能忽视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.dirlocal.properties以正确的价值.

android arm abi android-ndk

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

如何防止Cargo将相同的依赖项与不同的功能合并?

找出相同代码的货物构建后:虚假的编译时错误?,我想知道如何防止这样的问题:

$ 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 …

rust rust-crates rust-cargo

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

为什么编译器不能优化std :: string concat?

我尝试这么简单的代码:

#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 :: …

c++ string gcc clang

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

从Rust线程和外部线程修改Arc <Mutex <T >>是否安全?

是否有任何通用规则,设计文档或类似的东西解释了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)

multithreading rust

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

CMake 和 CTest:自动运行测试的依赖项

在我的 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 将运行textYtestZtestX。有什么办法可以做到这一点吗?

或者,如果现在不可能,是否有任何方法可以通过脚本从 CMake 构建目录中提取有关依赖项的信息?

c c++ testing cmake ctest

5
推荐指数
2
解决办法
2471
查看次数

如何在没有Rust编译器的情况下在另一台机器上运行货物测试?

我知道,编译器可以直接运行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 rust-cargo

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