使用clang++-11withlibstdc++-11和clang-tidy-11,我在用 linting 代码时遇到了失败clang-tidy- 即在处理众所周知的 sleeper 时出现解析错误std::this_thread::sleep_for(std::chrono::seconds(1));。
clang-tidy-11 -header-filter=include/ -p=/tmp/dev/build/bin/aggregation/ -quiet /tmp/de
v/build/aggregation/src/main.cc
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0. Program arguments: clang-tidy-11 -header-filter=include/ -p=/tmp/dev/build/bin/
aggregation/ -quiet /tmp/dev/build/aggregation/src/main.cc
1. <eof> parser at end of file
2. While analyzing stack:
#0 Calling std::chrono::operator<=> at line /usr/include/c++/11/thread:125:6
#1 Calling std::this_thread::sleep_for at line 159
#2 Calling main
3. /usr/include/c++/11/chrono:771:9: Error evaluating statement
4. /usr/include/c++/11/chrono:771:9: Error evaluating …Run Code Online (Sandbox Code Playgroud) 根据我的知识(以及这个主题:什么时候应该使用static_cast,dynamic_cast,const_cast和reinterpret_cast?)const_cast是唯一应该能够取消变量constness的转换.然而,当我搞砸了clang-6.0,g++5.4.0我偶然发现了一个与上述相反的行为.看起来static_cast完全一样.
这些主要功能与两个编译器提供完全相同的结果:
测试类定义
struct Base {
Base() {
std::cout << "Base::Base()\n";
}
void test() const {
std::cout << "Base::test()\n";
}
void no_const() {
std::cout << "Base::no_const()\n";
}
virtual ~Base() = default;
};
Run Code Online (Sandbox Code Playgroud)
同 const_cast
int main(void) {
std::cout << "BEGIN\n";
const Base b;
const_cast<Base&>(b).no_const();
std::cout << "END\n";
}
Run Code Online (Sandbox Code Playgroud)
同 static_cast
int main(void) {
std::cout << "BEGIN\n";
const Base b;
static_cast<Base>(b).no_const();
std::cout << "END\n";
}
Run Code Online (Sandbox Code Playgroud)
结果:
BEGIN
Base::Base()
Base::no_const() …Run Code Online (Sandbox Code Playgroud) 在最近的OS升级中,我注意到我的代码中的一小部分停止了编译-看来原因是从切换g++-8到g++-9。
这段代码可以正常编译g++ 8.3.0(使用gcc:8.3Dockerhub的图像对此进行了验证)
#include <filesystem>
#include <chrono>
int main() {
namespace fs = std::filesystem;
using namespace std::chrono_literals;
std::filesystem::last_write_time("test", std::chrono::system_clock::now() - 5min);
}
Run Code Online (Sandbox Code Playgroud)
在g++ 9.1.0它失败与:
test.cpp: In function 'int main()':
test.cpp:8:69: error: no matching function for call to 'last_write_time(const char [5], std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >)'
8 | fs::last_write_time("test", std::chrono::system_clock::now() - 5min);
| ^
In file included from /usr/local/include/c++/9.1.0/filesystem:39,
from test.cpp:1:
/usr/local/include/c++/9.1.0/bits/fs_ops.h:243:19: note: candidate: 'std::filesystem::file_time_type std::filesystem::last_write_time(const std::filesystem::__cxx11::path&)'
243 | …Run Code Online (Sandbox Code Playgroud) 在Windows上使用roo gem,代码如下:
require 'roo'
require 'roo-xls'
workbook = Roo::Excel.new 'test.xls'
Run Code Online (Sandbox Code Playgroud)
我收到了STDOUT的消息
[DEPRECATION] extend Roo::Tempdir and use its .make_tempdir instead
Run Code Online (Sandbox Code Playgroud)
代码工作正常后,我能够做我想要的每一件事.但是,我想摆脱这个消息(没有创建一个新的类或类似的东西,它只是打开一个文件......对吗?).我怎么做?
最近的操作系统升级使我的覆盖脚本惨遭失败。
lcov 1.13
gcov (GCC) 9.1.1
我的 CMake 中用于生成覆盖率数据的部分:
if ($ENV{COVERAGE})
message("Setting up for coverage")
enable_testing()
include(CodeCoverage)
setup_target_for_coverage(${PROJECT_NAME}_coverage tests coverage)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
endif ()
Run Code Online (Sandbox Code Playgroud)
lcov我在构建测试后发出的命令:
lcov --capture --directory build/ --output-file coverage.info
不幸的是现在失败了:
Capturing coverage data from build/
Found gcov version: 9.1.1
Scanning build/ for .gcda files ...
geninfo: WARNING: no .gcda files found in build/ - skipping!
Finished .info-file creation
Run Code Online (Sandbox Code Playgroud)
错误消息是有道理的,因为没有.gcda文件 - 只有.gcno文件。我不确定它们是否具有相同的目的和/或可以与lcov.
我发出了nm some_binary | grep gcov,有很多符号的形式:
00000000004b3520 d …Run Code Online (Sandbox Code Playgroud) 我有这个简单的解析功能
use std::collections::BTreeMap;
fn parse_kv(data: &str) -> BTreeMap<String, String> {
data.split('&')
.map(|kv| kv.split('='))
.map(|mut kv| (kv.next().unwrap().into(), kv.next().unwrap().into()))
.collect()
}
#[test]
fn parse_kv_test() {
let result = parse_kv("test1=1&test2=2");
assert_eq!(result["test1"], "1");
assert_eq!(result["test2"], "2");
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但是我想要这样的Option或Result返回类型:
fn parse_kv(data: &str) -> Option<BTreeMap<String, String>>
Run Code Online (Sandbox Code Playgroud)
此实现:
fn parse_kv(data: &str) -> Option<BTreeMap<String, String>> {
Some(data.split('&')
.map(|kv| kv.split('='))
.map(|mut kv| (kv.next()?.into(), kv.next()?.into()))
.collect())
}
Run Code Online (Sandbox Code Playgroud)
不幸的是给出了以下错误:
error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`)
--> …Run Code Online (Sandbox Code Playgroud) 我想访问 a 中最大元素旁边的元素Vec<i32>。我正在寻找这样的东西:
let v = vec![1, 3, 2];
let it = v.iter().max_element();
assert_eq!(Some(&2), it.next());
Run Code Online (Sandbox Code Playgroud)
在 C++ 中,我会使用std::max_element然后只增加迭代器(有或没有边界检查,取决于我此刻的冒险精神)。Rustmax只返回对元素的引用,这对我的用例来说不够好。
我想出的唯一解决方案是使用enumerate获取项目的索引 - 但与 C++ 方式相比,这似乎是手动且繁琐的。
我更喜欢标准库中的东西。
这个例子是简化的——我实际上想附加到最高值,然后从那个点循环整个容器(可能是cycle()或类似的东西)。
我是C++的初学者,目前我正在学习如何做功能.最近我收到了以下练习:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
int a,sum=0;
cout<<"Enter a number:";
cin>>a;
int func(int x);
sum=func (a );
cout<<"\n"<<sum;
}
int func(int a)
{
int x;
for (int i=0; i<=a; i++)
{
x+=i;
}
return x;
}
Run Code Online (Sandbox Code Playgroud)
我已经提前给了代码的int主要部分,我需要做的是完成int func部分,以便代码正确执行.如果我运行此代码,我只会得到一些随机数.什么是func应该做的是返回由用户估算数量的限制所有自然数的总和.你能告诉我如何更改这段代码才能正常工作?感谢您的任何反馈!
我有一个功能f(unsigned char ** data);.另外,我有一个指向pObj 带有unsigned char* pbCert成员的对象的指针.因此,我想执行如下操作:
f(pObj->&pbCert);
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到了member identifier expected错误.
我设法使用这种方法解决问题:
unsigned char* temp = pObj->pbCert;
f(&temp);
Run Code Online (Sandbox Code Playgroud)
但是我很好奇,是否有一些聪明的记法技巧只在一行中做到这一点?