小编the*_*oid的帖子

嵌入式项目的C/C++ HTTP客户端库

所以我在StackOverflow和Google上浏览了搜索结果的页面和页面,我遇到了很少适合资源受限的嵌入式环境(例如ARM)的C/C++ HTTP客户端库.然而,我遇到了很多适合桌面级应用程序的东西.

从本质上讲,我使用简单,易用且方便的API来进行HTTP GET,POST和HEAD调用(支持身份验证,下载恢复和有效负载压缩).如果它具有较小的占用空间(即没有或最小的外部依赖性)并且是开源的(具有许可许可证),那将是理想的.

这是我到目前为止所遇到的一系列清单以及它们不适合的原因 -

那里有没有我不知道的图书馆,或者我最好自己滚动?

c c++ embedded client http

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

重置Ruby中的单例实例

如何在Ruby中重置单个对象?我知道在真正的代码中我们永远不想这样做但是单元测试呢?

这是我在RSpec测试中尝试做的事情 -

describe MySingleton, "#not_initialised" do
  it "raises an exception" do
    expect {MySingleton.get_something}.to raise_error(RuntimeError)
  end
end
Run Code Online (Sandbox Code Playgroud)

它失败是因为我之前的一个测试初始化​​了单例对象.我试过从这个链接开始关注Ian White的建议,它基本上是猴子补丁Singleton来提供reset_instance方法,但我得到一个未定义的方法'reset_instance'异常.

require 'singleton'

class <<Singleton
  def included_with_reset(klass)
    included_without_reset(klass)
    class <<klass
      def reset_instance
        Singleton.send :__init__, self
        self
      end
    end
  end
  alias_method :included_without_reset, :included
  alias_method :included, :included_with_reset
end

describe MySingleton, "#not_initialised" do
  it "raises an exception" do
    MySingleton.reset_instance
    expect {MySingleton.get_something}.to raise_error(RuntimeError)
  end
end
Run Code Online (Sandbox Code Playgroud)

在Ruby中最常用的方法是什么?

ruby singleton rspec rspec2

20
推荐指数
3
解决办法
8481
查看次数

什么是'Saff Squeeze'找到错误的方法?

我已阅读Kent Beck的原始博客帖子上的孔雀皇挤压方法.我还阅读了这篇InfoQ帖子,详细阐述了该主题,但未提供任何示例.

我知道它本质上是一种在不依赖调试器的情况下查找错误的方法.但是我发现Kent的例子并不那么明确.

更开明的人可以通过一个明确,具体的例子教育我如何使用这种方法吗?它有望成为研究该方法的其他人的学习资源.

language-agnostic debugging tdd unit-testing saff-squeeze

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

浮点数,我可以信任多于/大于比较?

假设我有两个浮点数,我想比较它们.如果一个大于另一个,程序应该采用一个分叉.如果情况恰恰相反,那么应采取另一条道路.并且它应该做同样的事情,如果被比较的值被轻微地推向一个方向,仍然应该比较真实.

这是一个难以解释的问题,所以我写这篇文章来证明它 -

float a = random();
float b = random();  // always returns a number (no infinity or NaNs)

if(a < b){
    if( !(a < b + FLOAT_EPISILON) ) launchTheMissiles();
    buildHospitals();

}else if(a >= b){
    if( !(a >= b - FLOAT_EPISILON) ) launchTheMissiles();
    buildOrphanages();

}else{
    launchTheMissiles();  // This should never be called, in any branch
}
Run Code Online (Sandbox Code Playgroud)

鉴于此代码,launchTheMissiles()保证永远不会被调用?

c++ floating-point

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

在Windows上使用-faddress-sanitizer进行操作

我的目的是在Windows上Clang用作替代,以便Valgrind在我编写的C/C++程序中找到缓冲区溢出,动态内存滥用等.我已按照此处提供的说明成功构建了Clang .

我试图编译一个简单的C程序与-faddress-消毒剂选项(如指定位置)及以下的错误被抛出-

gcc.exe: error: unrecognized command line option '-faddress-sanitizer'
Using built-in specs.
COLLECT_GCC=C:/MinGW/bin/gcc.exe
Target: mingw32
Configured with: ../gcc-4.7.0/configure --enable-languages=c,c++,ada,fortran,objc,obj-      c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --disable-build-poststage1-with-cxx --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.7.0 (GCC)
clang: error: assembler (via gcc) command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

为什么clang(据我所知)调用GCC?当然GCC不支持-faddress-sanitizer选项.

我很高兴有可能使用这个,因为我一直试图找到一个好的(免费)替代Valgrind一段时间.有人可以帮忙吗?

c c++ windows valgrind clang

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

fork子进程与超时和捕获输出

假设我有类似下面的函数,如何捕获Process.spawn调用的输出?如果进程花费的时间超过指定的超时时间,我也应该能够终止进程.

请注意,该功能还必须是跨平台的(Windows/Linux).

def execute_with_timeout!(command)
  begin
    pid = Process.spawn(command)     # How do I capture output of this process?
    status = Timeout::timeout(5) {
      Process.wait(pid)
    }
  rescue Timeout::Error
    Process.kill('KILL', pid)
  end
end
Run Code Online (Sandbox Code Playgroud)

谢谢.

ruby linux windows stdout process

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

构建嵌入式C/C++项目的系统

我正在寻找一个高级构建系统/工具,可以帮助我将嵌入式C项目组织成"模块"和"组件".请注意,这两个术语非常主观,因此我的定义如下.

  • 模块是c和h文件的内聚集合,但只有一个公共h文件,其他模块可见.
  • 另一方面,组件(或层)是模块的集合(例如,应用层,库层,驱动器层,RTOS层等).

构建系统/工具应该 -

  • 防止组件和模块之间的循环依赖(模块内的循环依赖性是可以的)
  • 防止访问模块的私有障碍.如果其他模块尝试包含模块专用的头文件,则构建系统必须抛出错误.但是,私有屏障内的文件必须能够在该屏障内包含其他文件.
  • 支持在主机上自动构建和执行单元测试(TDD的快速反馈循环)
  • 支持在目标模拟器上运行的单元测试
  • 支持代码静态分析
  • 支持代码生成
  • 支持代码重复检测(强制执行DRY原则)
  • 支持代码美化
  • 支持生成单元测试代码覆盖率指标
  • 支持生成代码质量指标
  • 与平台无关

我可以编写自己的构建工具并花费大量时间.然而,这不是我的专业领域,如果有人已经创造了这样的工具,我宁愿不重新发明轮子.

c c++ build-process build build-system

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

为什么我不能将SetArgPointee()与googlemock一起使用?

我试图在模拟器上设置一个"out"参数SetArgPointee.这是我正在测试的代码:

DWORD bodysize = 1024;
char body[1024];
HRESULT hr = req->ReadEntityBody(body, bodysize, false, &bodysize, NULL);
Run Code Online (Sandbox Code Playgroud)

req是一个IHttpRequest*,我想bodysize在mock中设置参数3.这是我单元测试的代码:

EXPECT_CALL(req, ReadEntityBody(NotNull(), Ge(1024), false, NotNull(), _))
    .WillOnce(SetArgPointee<3>(4))
    .WillOnce(Return(ERROR_HANDLE_EOF));
Run Code Online (Sandbox Code Playgroud)

这导致以下奇怪的错误:

错误C2440:'return':无法从'void'转换为'long'(gmock/gmock-actions.h:369)

如果我注释掉.WillOnce(SetArgPointee<3>(4)),代码会正确编译并执行.这是模拟本身的相关定义:

MOCK_METHOD5(ReadEntityBody, HRESULT(VOID *pvBuffer, DWORD cbBuffer, BOOL fAsync, DWORD *pcbBytesReceived, BOOL *pfCompletionPending));
Run Code Online (Sandbox Code Playgroud)

并且,如果有帮助,我完全嘲笑IHttpRequest.

c++ unit-testing googlemock

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

自动为C/C++可执行文件生成目标文件(链接器)依赖项

我目前正在开发一个灵活的C/C++构建框架,我很快就会(有希望)开源.(有关背景,请参阅问题).

我使用以下命令为源/头文件生成#include文件依赖项.

gcc -M -MM -MF
Run Code Online (Sandbox Code Playgroud)

有没有一种巧妙地推断可执行文件的链接器(.o文件)依赖关系(单元测试+在我的情况下为目标平台的主要可执行文件)使用gcc/GNU实用程序以类似的方式?目前,该框架做了很多假设,并且在确定这些依赖关系时非常愚蠢.

我听说过一种方法,其中nm命令可用于在目标文件中提供未定义符号的列表.例如,在目标文件上运行nm(使用gcc -c编译)会出现类似这样的内容 -

nm -o module.o

module.o:         U _undefinedSymbol1
module.o:         U _undefinedSymbol2
module.o:0000386f T _definedSymbol
Run Code Online (Sandbox Code Playgroud)

然后,人们将查找其他目标文件,其中定义了这些未定义的符号,以提供成功链接文件所需的目标文件依赖性列表.

这是确定可执行文件的链接器依赖性的最佳实践吗?有没有其他方法可以推断出这些依赖关系?在提出解决方案时,假设所有目标文件已经存在(即已经使用gcc -c编译).

c c++ linker dependencies gcc

7
推荐指数
2
解决办法
5393
查看次数

如何让 git log 显示相对于当前目录的文件路径?

目前我正在处理的基于 Git 的项目,我通常总是在一个子目录中。

下面是我git log --name-only从存储库根目录的子目录运行命令时的输出。

commit 678bd5ba6fc5474c4c61406768bf6cba5937c5d1
Author: thegreendroid
Date:   Mon Mar 27 09:36:24 2017 +1300

    Commit message

 child_dir1_from_root/file1                     |  184 +--
 child_dir2_from_root/file2                     |    2 +-
Run Code Online (Sandbox Code Playgroud)

我如何git log才能输出类似下面的内容?这使得比较列出的文件非常容易,只需复制文件路径并运行,git diff HEAD~ {copied_file_path}而不必手动修改文件路径然后运行命令。

commit 678bd5ba6fc5474c4c61406768bf6cba5937c5d1
Author: thegreendroid
Date:   Mon Mar 27 09:36:24 2017 +1300

    Commit message

 file1                                          |  184 +--
 ../child_dir2_from_root/file2                  |    2 +-
Run Code Online (Sandbox Code Playgroud)

我查看了git log文档,但没有任何突出之处。我可以编写一个脚本来做到这一点,但我很好奇 Git 是否有内置方式。

git diff git-diff git-difftool

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