小编mar*_*trz的帖子

默认情况下在CMake中进行优化

我有一个C++项目,它使用CMake作为它的构建系统.我想要以下行为:

如果调用cmake cmake ..,CMAKE_CXX_FLAGS则为-O3 -Wall -Wextra

如果调用cmake cmake .. -DCMAKE_BUILD_TYPE=Debug,CMAKE_CXX_FLAGS则为-g -Wall -Wextra

我尝试了以下内容

message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")

set(CMAKE_CXX_FLAGS "-O3 -Wall -Wextra")
set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall -Wextra")
Run Code Online (Sandbox Code Playgroud)

但这有一个很大的问题.首先,如果使用第二次调用,则将两者-O3-g标志传递给编译器.此外,如果我使用第二次调用和之后的第一次调用,虽然没有明确排序,但CMAKE_BUILD_TYPE仍然保留Debug- 所以我得到一个Debug构建,尽管我想要一个优化的构建.

为什么?我该怎么做才能获得理想的行为?

c++ cmake compiler-optimization

23
推荐指数
2
解决办法
4万
查看次数

在宏内提取函数名称

在C中,我们经常需要运行这样的代码

if (! somefun(x, y, z)) {
    perror("somefun")
}
Run Code Online (Sandbox Code Playgroud)

是否可以创建一个宏,使用如下:

#define chkerr ...
chkerr(somefun(x, y, z));
Run Code Online (Sandbox Code Playgroud)

会编译到上面吗?

我已经知道我可以使用__VA_ARGS__宏了,但这需要我称之为

chkerr(somefun, x, y, z)         
Run Code Online (Sandbox Code Playgroud)

c c-preprocessor

23
推荐指数
2
解决办法
2071
查看次数

retq和ret有什么区别?

让我们考虑以下程序,它计算参数的无符号平方:

.global foo
.text
foo:
    mov %rdi, %rax
    mul %rdi
    ret
Run Code Online (Sandbox Code Playgroud)

这是由适当编译as,但反汇编

0000000000000000 <foo>:
   0:   48 89 f8                mov    %rdi,%rax
   3:   48 f7 e7                mul    %rdi
   6:   c3                      retq   
Run Code Online (Sandbox Code Playgroud)

有什么区别retretq

linux assembly x86-64

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

我应该如何正确播种C++ 11 std :: default_random_engine?

根据这篇文章,直观播种std::random_device可能不会产生预期的结果.特别是,如果使用Mersenne Twister引擎,则不能达到所有初始化状态.使用seed_seq也不会帮助,因为它不是双射.

据我所知,这一切意味着std::uniform_int_distribution并非真正的统一 - 因为并非所有的种子价值都是可能的.

我想简单地生成几个随机数.虽然这是一个非常有趣的话题,我肯定会把我的一些空闲时间用在一起,但很多人可能没有这种可能性.

所以问题是:我应该如何正确地播种,std::default_random_engine以便它完全符合我的期望?

c++ random c++11

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

写入全局属性QML无效

我有这个信号

class SystemUICfgScanner 
{
    /*code here*/
signals:
    void error(QString desc);
    /*more code*/
};
Run Code Online (Sandbox Code Playgroud)

在QML中,我使用InfoBanner:

InfoBanner
{
    property string infodetails: ""
    id: systemuicfgErrorBanner
    text: "Error: " + infodetails
    Connections
    {
        target: cfgScanner
        onError: infodetails = desc
    }
}
Run Code Online (Sandbox Code Playgroud)

当发出错误(QString)信号时,我收到此错误

Invalid write to global property "infodetails"
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

提前致谢

qt properties qt4 qml qtdeclarative

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

QML动画可见属性更改

我希望在元素变得可见时绘制动画(应该是平滑的,而不是整体)

我试过这个

states: State
{
    name: "iconOff"
    when: iconOnSwitch.checked == false
    PropertyChanges { target: selectIconRow; visible: false }
}

transitions: Transition
{
    reversible: true
    from: ""
    to: "iconOff"
    PropertyAnimation
    {
        properties: "x,y,visible"
        easing.type: Easing.InOutQuad
        from: selectIconRow
        property: "visible"
    }
}
Run Code Online (Sandbox Code Playgroud)

但selectIconRow仍然会立即出现

我该如何使用这样的动画?

animation qt transition qt4 qml

13
推荐指数
4
解决办法
2万
查看次数

如何使用初始化列表循环来修改元素?

我可以for .. in使用初始化程序列表轻松模拟循环以进行读取访问

std::list<int> foo, bar, baz;

int main() 
{
  foo.push_back(3);
  foo.push_back(2);
  bar.push_back(1);
  for (auto &x : {foo, bar, baz}) {
    // x.push_back(42);
    std::cout << x.size() << std::endl;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这打印:

2
1
0
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能修改实际对象,就像在注释行中一样:

// x.push_back(42);
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list

12
推荐指数
2
解决办法
837
查看次数

获取当前显示的委托的索引 - QML ListView

我创建了一个ListView,它显示了用户定义的几页内容(纯文本).显示的页面是委托.一次只能看到一个页面.我决定使用它来捕捉到一个项目,就像iOS'启动器的工作原理一样.用户只需在页面之间轻弹即可.(这将用于触摸屏)

我需要有一些操作的当前显示页面的索引.ListView的currentIndex始终保持== 0.我怎样才能得到它?

对于喜欢代码的人:

 ListView
 {
      onCurrentIndexChanged: console.log(currentIndex) // this gets called only once - at startup
      delegate: Column
      {
           // The page displayed, only one page at a time
      }
 }
Run Code Online (Sandbox Code Playgroud)

谢谢

qt listview list qml

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

将CMib2与CMake一起使用的推荐方法是什么?

我喜欢在我的C应用程序中使用GLib,它使用CMake作为构建系统.

现在,我在某种程度上混淆了如何在我的CMakeLists.txt中启用GLib.基本上,你使用find_package命令在cmake中添加库,所以我尝试了,根据这个 bug报告

find_package(GLib2)
Run Code Online (Sandbox Code Playgroud)

但没有找到任何东西.pkg-config另一方面,建议在GLib文档中使用.

在基于cmake的项目中启用glib的推荐方法是什么?

glib cmake

10
推荐指数
3
解决办法
8277
查看次数

为什么imul用于乘以无符号数?

我编译了以下程序:

#include <stdint.h>

uint64_t usquare(uint32_t x) {
  return (uint64_t)x * (uint64_t)x;
}
Run Code Online (Sandbox Code Playgroud)

这拆解为:

 0: 89 f8                   mov    eax,edi
 2: 48 0f af c0             imul   rax,rax
 6: c3                      ret  
Run Code Online (Sandbox Code Playgroud)

但是imul用于乘以有符号数字的指令.那为什么用gcc呢?

/ edit:使用uint64_t程序集时类似:

0:  48 0f af ff             imul   rdi,rdi
4:  48 89 f8                mov    rax,rdi
7:  c3                      ret  
Run Code Online (Sandbox Code Playgroud)

x86 assembly unsigned x86-64 multiplication

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