小编rig*_*717的帖子

如何在 QML 中模拟 C 风格的“ifdef”宏?

我需要关闭 QML 代码的某些部分,因为这段代码是为了演示目的而完成的,它将在最终版本中删除。但是该产品将与这些演示功能一起使用很长时间,因此我不能使用带有演示功能的单独分支并不断将所有新功能合并到该分支 - 只是不方便。因此,运行此代码会很好,但在需要时可以轻松关闭和/或删除。在 C 和 C++ 中,我ifdef为此使用宏,但在 QML 中是否可以这样做?

macros qt qml qt5

9
推荐指数
2
解决办法
7970
查看次数

如何检查 LLDB 是否从共享库加载了调试符号?

在 Linux 上我使用

(gdb) i shared
Run Code Online (Sandbox Code Playgroud)

在 gdb 中,gdb 打印一个库列表,*如果没有加载调试符号,则带有星号,如果加载则不带星号,例如:

0x0000000100c18660  0x0000000100c489a0  Yes (*)     /Users/anon/work/software/webrtc-audio-processing-0.1/build_darwin/../bin/darwin/lib/libwebrtc_audio_processing.0.dylib
0x0000000100c57ca0  0x0000000100c76978  Yes         /Users/anon/work/software/speex/speex/speex-1.2rc2/build_darwin/../bin/darwin/lib/libspeex.1.dylib
Run Code Online (Sandbox Code Playgroud)

我发现在 LLDB 中我应该使用

(lldb) image list

做同样的事情。但是我得到了一个库列表,它对我是否为 lib 加载了调试符号没有任何说明,例如:

[181] 19269C1D-EB29-384A-83F3-7DDDEB7D9DAD 0x00007fff8d2d3000 /System/Library/PrivateFrameworks/CoreWiFi.framework/Versions/A/CoreWiFi
[182] 8D7BA9BA-EB36-307A-9119-0B3D9732C953 0x00007fff879ee000 /System/Library/Frameworks/CoreBluetooth.framework/Versions/A/CoreBluetooth
[183] 6F03761D-7C3A-3C80-8031-AA1C1AD7C706 0x00007fff92e52000 /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols
Run Code Online (Sandbox Code Playgroud)

那么如何检查 LLDB 是否加载了调试符号?

更新:我刚刚决定发布(lldb) image lookup -vn <function>(感谢吉姆)的输出,让其他人知道它是什么样子:

image lookup -vn Herqq::Upnp::HSsdp::init
2 matches found in libHUpnp.2.dylib:
        Address: libHUpnp.2.dylib[0x00000000000283f0] (libHUpnp.2.dylib.__TEXT.__text + 150384)
        Summary: libHUpnp.2.dylib`Herqq::Upnp::HSsdp::init() at hssdp.cpp:804
         Module: file = "libHUpnp.2.dylib", arch = "x86_64"
    CompileUnit: id = …
Run Code Online (Sandbox Code Playgroud)

c++ debugging macos debug-symbols lldb

7
推荐指数
1
解决办法
8045
查看次数

在可变参数模板方法和通常的模板方法之间进行选择的规则是什么?

我在课堂上有两个模板操作符:

    template<class T>
    size_t operator()(const T& t) const {
        static_assert(boost::is_pod<T>(), "Not a POD type");
        return sizeof t;
    }

    template<typename... T>
    size_t operator()(const boost::variant<T...>& t) const
    {
        return boost::apply_visitor(boost::bind(*this, _1), t);
    }
Run Code Online (Sandbox Code Playgroud)

boost::variant<some, pod, types, here>作为参数传递给这些运算符.GCC 4.8和llvm 6.0编译代码很好,选择boost::variant参数化运算符.gcc 4.7选择const T& t参数化运算符,因此由于静态断言而无法编译.

所以,我有一个问题,在这两者之间选择的规则是什么?我认为gcc 4.7必须有一个bug,但我没有任何证据.

c++ gcc templates boost

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

在传递的对象被销毁之前发送信号传递QObject指针作为参数是否安全?

让我们考虑这个简单的例子:

Class Emitter: public QObject {
...
signal:
    surfaceDestroyed(QObject*);
public:
    void emittingMethod(QObject* surface) {
        emit surfaceDestroyed(surface);
        delete surface;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有这种情况的排队连接

connect(emitterObject, SIGNAL(surfaceDestroyed(QObject*), receiverObject,
    SLOT(onSurfaceDestroyed(QObject*)), Qt::QueuedConnection);
Run Code Online (Sandbox Code Playgroud)

在onSurfaceDestroyed方法中,取消引用并使用接收到的QObject

那么问题是这段代码的安全性如何?我在QT网站上已经阅读了很多相关信息,但我仍然没有清楚地了解这个问题.

在我看来,这个代码是不安全的,因为一旦处理了事件循环并且接收器对象访问释放的内存,就会发送信号,然后表面被破坏,而不是事件发生在receiverObject上,因此SIGSEGV

这是真实代码的简化示例,因此很难跟踪崩溃是否会因此而发生.

c++ qt signals-slots

3
推荐指数
1
解决办法
7066
查看次数

错误地使用std :: copy?

这是一个简单的测试程序,说明了我遇到的问题:

#include <iostream>
#include <stdlib.h>
#include <inttypes.h>
#include <vector>

using namespace std;
typedef unsigned char Byte;

int main( )
{
    uint32_t ui32 = 12;
    size_t sizeofUi32 = sizeof ui32;
    cout << "sizeofUi32: " << sizeofUi32 << endl;
    vector<Byte> v(10);
    std::copy(&ui32, &ui32 + sizeof ui32, &v[4]);

    uint32_t result = 0;
    std::copy(&v[4], &v[4] + sizeof ui32, &result);

    cout << "Result: " << result << " sizeofUi32: " << sizeofUi32 << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

sizeofUi32: 4    
Result: 12 sizeofUi32: 17179869184
Run Code Online (Sandbox Code Playgroud)

我认为这个问题可能是由于std …

c++ std

3
推荐指数
1
解决办法
1167
查看次数

何时在SQL语句中使用单引号?

我知道我应该在处理TEXT类型的数据时使用它(我想那些可以归结为TEXT的数据),但这是唯一的情况吗?

例:

UPDATE names SET name='Mike' WHERE id=3
Run Code Online (Sandbox Code Playgroud)

我正在用C++编写一个SQL查询自动生成器,所以我想确保在不得不添加引号的情况下我不会错过案例.

sql sqlite quotes

3
推荐指数
1
解决办法
3628
查看次数

如何将32位有符号整数放入64位无符号整数的高32位?

例:

qint32 si32 = -1; // that gives us 0xFFFFFFFF
quint64 ui64 = si32; // that gives us 0xFFFFFFFFFFFFFFFF, that is expected
Run Code Online (Sandbox Code Playgroud)

期望的结果:

0xFFFFFFFF00000000
Run Code Online (Sandbox Code Playgroud)

当我试图像这样在si32上移位时

quint64 ui64 = si32 << 32;
Run Code Online (Sandbox Code Playgroud)

编译器警告我有关位移溢出的信息.

这应该是一项简单的任务,但我无法弄清楚如何做到这一点.这是一个unix C++代码(使用QT,但这没关系,普通的unix C++代码会这样做).

我很感激你的帮助.

c++ bit-shift

3
推荐指数
1
解决办法
515
查看次数

char*/字符串连接没有复制?

我想在没有新的内存分配和复制的情况下在C或C++中连接2个字符串.可能吗?

可能的C代码:

char* str1 = (char*)malloc(100);
char* str2 = (char*)malloc(50);
char* str3 = /* some code that concatenates these 2 strings
                without copying to occupy a continuous memory region */
Run Code Online (Sandbox Code Playgroud)

然后,当我不再需要它们时,我只是这样做:

free(str1);
free(str2);
Run Code Online (Sandbox Code Playgroud)

或者如果可能的话,我想在C++中实现相同的功能,使用std::string或者可能char*,但是在str3上使用newdelete(可能是void operator delete ( void* ptr, std::size_t sz )运算符(C++ 14)).

关于字符串连接有很多问题,但我没有找到一个问相同的问题.

c c++ string

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

未定义的swscale函数引用

我的应用程序根本无法链接到swscale库.我的意思是我试图在我的代码中使用的任何swscale方法都成为一个未定义的引用.我知道这个错误意味着什么 - 链接器找不到任何已使用函数的定义.

但问题是我确保:

  1. -L/usr/local/Cellar/ffmpeg/2.8.2/lib -lswscale 在链接器输出中,链接器实际上找到了lib,否则会抱怨丢失 swscale
  2. 图书馆真的存在:

    $ll /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale*

输出:

-r--r--r--  1 myuser  admin   519K Nov 20 19:33 /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.3.1.101.dylib
lrwxr-xr-x  1 myuser  admin    24B Nov 20 19:32 /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.3.dylib -> libswscale.3.1.101.dylib
-r--r--r--  1 myuser  admin   607K Nov 20 19:32 /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.a
lrwxr-xr-x  1 myuser  admin    24B Nov 20 19:32 /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.dylib -> libswscale.3.1.101.dylib
Run Code Online (Sandbox Code Playgroud)
  1. 该库具有正确的架构:

    $lipo -info /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.3.dylib

输出:

 Non-fat file: /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.3.dylib is architecture: x86_64
Run Code Online (Sandbox Code Playgroud)

我的机器架构:

$uname -m
Run Code Online (Sandbox Code Playgroud)

输出:

x86_64
Run Code Online (Sandbox Code Playgroud)
  1. 符号存在于二进制文件中,例如:

    $nm /usr/local/Cellar/ffmpeg/2.8.2/lib/libswscale.3.1.101.dylib | grep sws_alloc_context

输出:

000000000004e3b4 T _sws_alloc_context
Run Code Online (Sandbox Code Playgroud)
  1. 我也试过了几个不同的swcale二进制文件,不仅仅是"brew",还没有改变.我也尝试在我的Ubuntu笔记本电脑上做同样的事情,但它仍然是一样的.

这实际上是我正在尝试构建的QT应用程序.我应该提一下,我没有以同样的方式链接其他库的问题.我也使用以下方法成功编译 …

c c++ linker qt ffmpeg

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

标签 统计

c++ ×7

qt ×3

c ×2

bit-shift ×1

boost ×1

debug-symbols ×1

debugging ×1

ffmpeg ×1

gcc ×1

linker ×1

lldb ×1

macos ×1

macros ×1

qml ×1

qt5 ×1

quotes ×1

signals-slots ×1

sql ×1

sqlite ×1

std ×1

string ×1

templates ×1