小编S.M*_*.M.的帖子

Google Mock 匹配数组

我知道这个问题已被问过多次,但没有一个答案对我有用。这是我想测试的模拟函数:

  MOCK_METHOD2(sendInternal, void(uint8_t data[], uint8_t size));
Run Code Online (Sandbox Code Playgroud)

测试是这样的

    uint8_t expectedMessageData[3] = { 0x08, 0xda, 0xff };


    EXPECT_CALL(*serverFake, sendInternal(testing::_,3))
            .With(testing::Args<0, 1>(ElementsAre(0x08, 0xda, 0xff)))
            .Times(1);
Run Code Online (Sandbox Code Playgroud)

但这导致

预期参数:是一个元组,其字段 (#0, #1) 有 2 个元素,其中元素 #0 等于 '\b' (8),元素 #1 等于 '\xDA' (218) 实际:don' t 匹配,其字段 (#0, #1) 为 (0x7fcfd9500590, '\x11' (3)),有 3 个元素

对我来说,Gmock 似乎会比较参数而不是数组的元素。

我什至构建了一个自定义匹配器:

MATCHER_P2(HasBytes, bytes, size, "") {
    uint8_t * dataToCheck = arg;
    bool isMatch = (memcmp(dataToCheck, bytes, size) == 0);
    return isMatch;
}
Run Code Online (Sandbox Code Playgroud)

我可以看到(在调试时) isMatch == true 但测试仍然失败。

请帮忙!

c++ googletest googlemock

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

C 程序的“编译器正确”命令

这是关于Linux Journal 文章中提到的编译步骤。

C 程序是使用该文章中的cppcc1asld命令编译的。我能够使用cppasld执行这​​些步骤。但cc1抛出错误。

cpp hello_new_world.c -o hello_new_world.i
Run Code Online (Sandbox Code Playgroud)

因为我无法使用 cc1:

gcc -S hello_new_world.i -o hello_new_world.s
Run Code Online (Sandbox Code Playgroud)
ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -lc -lgcc -lgcc_s /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o hello_new_world.o -o hello_new_world
Run Code Online (Sandbox Code Playgroud)
as hello_new_world.s -o hello_new_world.o
Run Code Online (Sandbox Code Playgroud)

即使我可以使用gccSwitch-E-SSwitch来执行编译步骤,但在最新的 gcc 中-c是否有替换的命令?cc1或者如何使用专用命令正确编译?

$ cc1 hello_new_world.i -o …
Run Code Online (Sandbox Code Playgroud)

c gcc

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

链接到共享库时,不会导出静态库中的符号

共享库的代码是模块化的,由几个独立的单元组成。每个单元都内置在一个静态库中。


单元1.c

#include <stdio.h>

void HelloWorld() {
  printf("Hello World!\n");
}
Run Code Online (Sandbox Code Playgroud)

单元2.c

#include <stdio.h>

void GoodbyeWorld() {
  printf("Goodbye World!\n");
}
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2)

add_library(unit1 STATIC unit1.c)
target_compile_options(unit1 PRIVATE -fPIC)

add_library(unit2 STATIC unit2.c)
target_compile_options(unit2 PRIVATE -fPIC)

add_library(merged SHARED)
target_link_libraries(merged unit1 unit2)
set_target_properties(merged PROPERTIES LINKER_LANGUAGE C)
Run Code Online (Sandbox Code Playgroud)

构建步骤:

cmake . && cmake --build .
Run Code Online (Sandbox Code Playgroud)

libmerged.so 导出的符号:

$ nm -D --defined-only libmerged.so 
0000000000201020 B __bss_start
0000000000201020 D _edata
0000000000201028 B _end
00000000000005a0 T _fini
0000000000000458 T _init
Run Code Online (Sandbox Code Playgroud)

Q为什么不导出符号 HelloWorld 和 GoodbyeWorld?如何解决?

  • 我试过--version-script没有成功。 …

c cmake clang

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

配置 g++ 以使用 wxwidget 库构建 c++

我一直在尝试在 Linux 中使用 Wxwidget 编译并运行一个简单的 C++ 程序,但是当我构建它时,这就是我尝试构建时得到的结果:

Executing task: g++ -c $(find /home/sopheak/Documents/WXWIDGET/ -type f -iregex '.*\.cpp') -g -D__WXGTK__ -D_FILE_OFFSET_BITS=64 -DWX_PRECOMP -fno-strict-aliasing -pthread -I/usr/local/lib/wx/include/gtk3-unicode-static-3.1/** -Iusr/include/** -I/usr/include/gtk-3.0/** -I/usr/include/at-spi2-atk/2.0/** -I/usr/include/at-spi-2.0/** -I/usr/include/dbus-1.0/** -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/** -I/usr/include/gio-unix-2.0/** -I/usr/include/cairo/** -I/usr/include/pango-1.0/** -I/usr/include/fribidi/** -I/usr/include/harfbuzz/** -I/usr/include/atk-1.0/** -I/usr/include/pixman-1/** -I/usr/include/uuid/** -I/usr/include/freetype2/** -I/usr/include/libpng16/** -I/usr/include/gdk-pixbuf-2.0/** -I/usr/include/libmount/** -I/usr/include/blkid/** -I/usr/include/glib-2.0/** -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/** -I/usr/include/gtk-3.0/unix-print/** -Wall
  
zsh:1: no matches found: -I/usr/local/lib/wx/include/gtk3-unicode-static-3.1/**
The terminal process "zsh '-c', 'g++ -c $(find /home/sopheak/Documents/WXWIDGET/ -type f -iregex '.*\.cpp') -g -D__WXGTK__ -D_FILE_OFFSET_BITS=64 -DWX_PRECOMP -fno-strict-aliasing -pthread -I/usr/local/lib/wx/include/gtk3-unicode-static-3.1/** -Iusr/include/** -I/usr/include/gtk-3.0/** -I/usr/include/at-spi2-atk/2.0/** -I/usr/include/at-spi-2.0/** -I/usr/include/dbus-1.0/** -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/** -I/usr/include/gio-unix-2.0/** -I/usr/include/cairo/** …
Run Code Online (Sandbox Code Playgroud)

c++ linux wxwidgets visual-studio-code

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

为什么 i32 Box 类型可以在 Rust 中向下转型?

我们可以使用std::any::Any将不同类型收集到一个Box.

use std::any::Any;

fn foo(value: Box<dyn Any>) {
    if let Some(string) = value.downcast_ref::<String>() {
        println!("String: {}", *string);
    } else if let Some(int) = value.downcast_ref::<i32>() {
        println!("i32: {}", *int);
    }
}

fn main() {
    let x = Box::new("hello".to_owned());
    let y = Box::new(123);
    foo(x);
    foo(y);
}
Run Code Online (Sandbox Code Playgroud)

我们还可以用来downcast识别 a 中值的类型Box。我了解到C++中的类型可以通过虚函数来确定,根据这个问题,RTTI是如何工作的?。然而,类似的类型i32在 Rust 中也可以被向下转型。它是如何工作的?

rust

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

如何从 Visual Studio IntelliSence 提示中隐藏私有重载函数?

我有这门课:

class BST
{
public:
   void insert(int val) { insert(node, val); }
private:
   void insert(std::shared_ptr<Node> node, int i);
   std::shared_ptr<Node> node = nullptr;
};
Run Code Online (Sandbox Code Playgroud)

这里我为类用户插入了公共函数。以及 if 的私有重载版本。当我想从驱动程序代码调用此函数时,在 IntelliSence 提示中我有此函数的两个重载。 在此输入图像描述

那么是否有办法对用户隐藏私有功能呢?

c++ intellisense

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

为什么C++中返回类型为std::string时会出错?

我有一个枚举类和一个将枚举类值与字符串匹配的映射。

\n

例如,

\n
enum class FRUIT {\n    APPLE,\n    ORANGE,\n    MELON\n};\n\nstd::map<FRUIT, std::string> m {\n    {FRUIT::APPLE,  "3"},\n    {FRUIT::ORANGE, "SWEET"},\n    {FRUIT::MELON,  "24.5"}\n};\n
Run Code Online (Sandbox Code Playgroud)\n

还有一个类模板包装每个枚举类值的实际数据类型。

\n
template<FRUIT f>\nstruct Type {\n  using type=int;  \n};\ntemplate<> struct Type<FRUIT::ORANGE> {\n    using type=string;\n};\ntemplate<> struct Type<FRUIT::MELON> {\n    using type=double;\n};\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试获取与每个枚举类值相对应的值,如下所示

\n
template<FRUIT f>\ntypename Type<f>::type getValue() {\n    \n    if (is_same<typename Type<f>::type, int>::value)\n        return std::stoi( m[f] );\n\n    else if (is_same<typename Type<f>::type, double>::value)\n        return std::stod( m[f] );\n\n    else if (is_same<typename Type<f>::type, string>::value)\n        return m[f];    \n}\n
Run Code Online (Sandbox Code Playgroud)\n

我不知道错误出在哪里。当调用 时getValue<FRUIT::APPLE>(),我认为满足第一个条件并因此std::stoi(m[f]) …

c++ struct return-type

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

结构体或类的实例可以被视为变量吗?

我读了:

\n
    \n
  • 变量是内存位置的名称。
  • \n
  • 在 C++ 中,变量实际上只是保留给程序\xe2\x80\x99 使用的一点内存。\n( https://en.cppreference.com/book/intro/variables )
  • \n
  • 变量名是标识符。标识符是 C++ 中用于各种事物的标签,包括函数、类、命名空间以及变量。
  • \n
\n

(意味着变量名只是标识符的一种情况)

\n

在标准 C++ 术语中,我们可以将结构体或类的实例名称视为变量吗?或者我们应该只称其为“标识符”吗?

\n

我知道这绝对是一个菜鸟问题,但即使我尝试从多个来源读取变量的定义,我自己也确实无法回答这个问题。请帮忙。

\n

c++ variables

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

通过 pybind11 迭代用 Python 包装的 C++ 对象

我有定义一个curves类、一个curve类和一个point类的C++ 代码,我正在尝试通过 pybind11 为这些类编写 Python 绑定并在 Python 中使用它们。

这些类的 pybind11 绑定如下所示:

namespace py = pybind11;

PYBIND11_MODULE(mymodule, m) {
    py::class_<_point>(m, "_point")
        .def(py::init<double, double>()) 
        .def_readwrite("next", &point::next)
        .def_readwrite("prev", &point::prev)
        .def_readonly("x1", &point::x1)
        .def_readonly("x2", &point::x2);
    py::class_<curve>(m, "curve")
        .def(py::init<point*>()) //constructor 1
        .def(py::init()) //constructor 2
        .def_readwrite("first", &curve::first)
        .def_readwrite("last", &curve::last)
        .def_readwrite("next", &curve::next)
        .def_readwrite("prev", &curve::prev);
    py::class_<curves>(m, "curves")
        .def(py::init()) 
        .def_readwrite("first", &curves::first)
        .def_readwrite("last", &curves::last);
}
Run Code Online (Sandbox Code Playgroud)

在 C++ 中,我可以通过以下方式遍历一个由curves对象curve 组成的point对象:

for(curve *c=curves_pointer->first; c; c=c->next) {
      for(point *p=c->first; p; p=p->next) {
          cout …
Run Code Online (Sandbox Code Playgroud)

c++ python pointers pybind11

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

闭包(lambda 函数)的大小与 std::function 或指针不同

#include <iostream>
#include <functional>

std::function<int(int)> makeLambda1(int x) {
  return [x] (int y) { return x * y; };
}

auto makeLambda2(int x) {
  return [x] (int y) { return x * y; };
}

auto makeLambda3() {
  return [] (int y) { return 10 * y; };
}

int main() {
  auto lambda1 = makeLambda1(10);
  auto lambda2 = makeLambda2(10);
  auto lambda3 = makeLambda3();
  std::cout << sizeof(lambda1) << " ";
  std::cout << sizeof(lambda2) << " ";
  std::cout << sizeof(lambda3) << " …
Run Code Online (Sandbox Code Playgroud)

c++ c++14

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