我的研究还没有得到答案(在SOF中),但我确信它之前肯定已经被问过了,如果有的话就会有所了解.
我在c ++中创建了一个枚举类型,然后我从消息头读取一个值,并希望将它存储到我的枚举类型的变量中,例如:
// My defined enum type
enum myNumType_t
{
MY_NUM_UNKNOWN = 0,
MY_NUM1 = 1,
MY_NUM2 = 2,
MY_NUM3 = 3,
MY_NUM4 = 4,
MY_NUM5 = 5,
};
// In the code
int main()
{
myNum_t myNum = MY_NUM_UNKNOWN;
myNum = getMessageNumType(); // returns an int
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以,这段代码不能用c ++编译,因为它不能将int转换为myNum_t,这是公平的.那么如果我投了它,myNum = (myNum_t) getMessageNumType();这当然现在编译.但它做对了吗?如果返回的值超出myNum_t的范围会发生什么?这里有"最佳实践"吗?
我有以下代码,我认为它可以正常工作(请原谅愚蠢/人为的例子)。
void run_thread()
{
std::thread t([]{
while(true)
{
// keep getting chars... to stop peoples eye's hurting : )
char c = getchar();
}
});
t.detach(); // Detach thread
// thread goes out of scope here - but is it ok because its detached??
}
int main()
{
run_thread();
// Wait here forever
while (true) {;}
}
Run Code Online (Sandbox Code Playgroud)
但在重读之后,我对它产生了怀疑。线程 t 超出范围。我现在不记得在你调用 detach() 之后这样做是否安全......我想是的,但正如我所说,我有一个唠叨的疑问。任何人都可以确认这是否是好的/坏的做法?
假设你有一个类(c ++)或模块(单个c文件).然后在你的一个函数中,你想要存储一个变量的副本并保持它的值,直到下次调用该函数为止,是否更好地拥有一个全局(在c ++中可以是私有的而在c中不是extern'd)它在模块范围内)还是制作一个局部静态变量?
例如:
void some_func_that_does_not_do_anything_useful(int arbVal)
{
static int lastArbVal = 0;
if (arbVal > lastArbVal)
{
lastArbVal = arbVal;
}
}
Run Code Online (Sandbox Code Playgroud)
我制作静态的原因是为了尽可能地保持其范围,但我读到的某些内容建议你应该使用全局变量,所以现在我很困惑.
什么是最好的(如果有的话)?,利弊?
我需要存储一个值(时间戳),然后在批处理文件中检索它.所以我搜索了SO以获取有关如何存储持久变量和找到setx的答案.
我用它是这样的:
C:\tmp>setx TIME_VAR %time%
SUCCESS: Specified value was saved.
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用echo打印时,它不存在:
C:\tmp>echo TIME_VAR
TIME_VAR
C:\tmp>echo %TIME_VAR%
%TIME_VAR%
Run Code Online (Sandbox Code Playgroud)
如何检索我的存储值?
我有一些Qt代码,我从我的svn repo下载.我工作了一段时间,但我确信它曾用于编译.
我有一个新版本的Qt和编译器(就像我上次的那样).我目前的编译器是:mingw 4.9.2 32位.
所以这是我的问题代码:
QByteArray dataBlock = audioTestFile.read(PACKET_SIZE_TO_ENCODE);
// This line is the issue
uint8Vect_t testVect = encodeData(uint8Vect_t(dataBlock.begin(), dataBlock.end()));
Run Code Online (Sandbox Code Playgroud)
哪里:
typedef std::vector<uint8_t> uint8Vect_t;
Run Code Online (Sandbox Code Playgroud)
和
uint8Vect_t encodeData(uint8Vect_t &dataBuff);
Run Code Online (Sandbox Code Playgroud)
所以你可以在这里看到我有一个函数encodeData(),它接受一个参数uint8Vect_t &(通过ref传递).我正在传递一个临时变量(我认为是一个rvalue),它是使用std :: vector构造函数(其中一个需要两个迭代器)从QByteArray dataBlock迭代器(我已经测试过)开始的.
但是,我收到错误:
../audioTest/txaudiostream.cpp:在成员函数'void CTxAudioStream :: playFile()':../audioTest/txaudiostream.cpp:212:94:错误:没有匹配函数来调用'CTxAudioStream :: encodeData(uint8Vect_t) )'uint8Vect_t testVect = encodeData(uint8Vect_t(dataBlock.begin(),dataBlock.end())); ^ ../audioTest/txaudiostream.cpp:212:94:注意:候选人是:../audioTest/txaudiostream.cpp:36:13:注意:uint8Vect_t CTxAudioStream :: encodeData(uint8Vect_t&)uint8Vect_t CTxAudioStream :: encodeData(uint8Vect_t&dataBuff) )^ ../audioTest/txaudiostream.cpp:36:13:注意:参数1从'uint8Vect_t {aka std :: vector}'到'uint8Vect_t&{aka std :: vector&}'没有已知的转换
基本上它是说我无法从uint8Vect_t转换为uint8Vect_t&.但是如果我将uint8Vect_t类型的变量传递给函数(而不是contructor/temp变量的返回值),那么这就行了.
我认为在c ++ 11中你可以传递rvalues ..但我显然在这里遗漏了一些东西.谁能解释一下:
所以我刚刚在版本1.27.2的ubuntu上安装了vscode。我也已经安装了c ++扩展。
一切正常,除了我似乎无法使用重构动作。具体来说,我想使用重命名符号(f2)。
当我单击一个变量并按f2时,没有任何反应。如果我执行ctrl + shift + r(重构操作),我总是会得到“没有可用的重构”。
我检查了键绑定,它显示为“ f2”:
因此,我检查了编辑器是否可写且文本具有焦点-都正确。但是我不确定该编辑器的重命名提供者是什么?
所以我需要安装其他东西吗?-如何进行重构?
我对 Rust 和 Cargo 很陌生,我正在尝试做一些非常简单的事情!
我有这样的东西(在 build.rs 中):
use std::process::Command;
fn main() {
Command::new("echo 123");
}
Run Code Online (Sandbox Code Playgroud)
我想查看命令的输出echo 123。我想123打印到构建输出(这主要是为了调试我正在做的事情)并且不会成为最终项目的一部分。
我已经尝试过cargo build --verbose-这不起作用。
我无法从那里的帖子中推断出答案(以及其他一些喜欢的帖子):
我觉得这一定很简单 - 但我已经在网上搜索了几个小时但没有找到答案。
使用doxygen我想以某种方式生成状态图.doxygen中是否有任何技巧可以帮助我们实现这一目标?
目前我只是使用预先格式化的文本,然后添加我自己的"自由文本图表",这是难以维护和绘制时间.
我使用doxygen生成的所有其他图表(即继承,关系等等),但由于状态机不是"标准"c/c ++构造(即eech设计师可以不同地实现它们),我想没有自动告诉doxygen为你做这件事的方法.但是,是否存在某种图表元素的创建,您可以在每个州旁边发表评论?也许像这个粗略的例子:
\section state Diagram
... description
\state state1...
\value1 returns state2
\value2 returns state1
int myState1Handler(){...}
\state state2...
\value1 returns state1
\value2 returns state2
int myState2Handler(){...}
Run Code Online (Sandbox Code Playgroud)
编辑1:
或者,是否可以使用下面评论中建议的graphviz标记语言,并以某种方式将它们与doxygen输出集成?
继这个问题之后:可以通过参考传递一段时间吗?
我有一个固定的代码片段:
// global variable
std::thread worker_thread;
// Template function
template <typename Functor>
void start_work(const Functor &worker_fn) // lambda passed by const ref
{
worker_thread = std::thread([&](){
worker_fn();
});
}
Run Code Online (Sandbox Code Playgroud)
这被称为:
void do_work(int value)
{
printf("Hello from worker\r\n");
}
int main()
{
// This lambda is a temporary variable...
start_work([](int value){ do_work(value) });
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我担心将临时lambda传递给线程构造函数,因为线程将运行,但函数start_work()将返回并且temp-lambda将超出范围.
但是我正在查看定义的std :: thread构造函数:
thread()noexcept; (1)(自C++ 11以来)
thread(thread && other)noexcept; (2)(自C++ 11起)
template <class Function,class ... Args> explicit thread(Function && f,Args && ... args); (3)(自C++ …
我想探索如何使用std::any而不是 void * 或此类构造进行消息传递。所以我创建了一个示例代码来测试这个 - 见下文。
std::any 的使用看起来不错,但我想切换类型以检查 std::any 是哪种类型。这可能是不可能的,而且我知道我可以使用 if/elseif... 块来代替,但是如果我可以创建一个 switch 语句,以便我在具有 10-20 种不同类型的实际代码中使用它,那就太好了它会更具可读性。
#include <string>
#include <iostream>
#include <sstream>
#include <any>
#include <typeindex>
struct ints { int a{1}; int b{2}; };
struct strings { std::string a{"string1"}; std::string b{"string2"}; };
void send_msg(std::any item)
{
switch (item.type().hash_code()) // <------- HERE
{
case typeid(ints).hash_code(): // <------- HERE
std::cout << "ints" << std::endl;
break;
case typeid(strings).hash_code():
std::cout << "strings" << std::endl;
break;
default:
std::cout << "unknown type\n";
}
} …Run Code Online (Sandbox Code Playgroud) c++ ×8
stdthread ×2
any ×1
batch-file ×1
build-script ×1
c ×1
c++11 ×1
c++17 ×1
casting ×1
command ×1
detach ×1
doxygen ×1
enumeration ×1
lambda ×1
qt ×1
refactoring ×1
rust ×1
rust-cargo ×1
static ×1
ubuntu ×1
windows ×1