小编cod*_*der的帖子

将整数强制转换为枚举类型是否正确?

我的研究还没有得到答案(在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的范围会发生什么?这里有"最佳实践"吗?

c++ enumeration casting

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

分离线程然后让它超出范围(并使其仍在运行)是否安全?

我有以下代码,我认为它可以正常工作(请原谅愚蠢/人为的例子)。

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++ detach stdthread

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

要创建持久变量,最好是拥有本地静态变量还是全局变量?

假设你有一个类(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)

我制作静态的原因是为了尽可能地保持其范围,但我读到的某些内容建议你应该使用全局变量,所以现在我很困惑.

什么是最好的(如果有的话)?,利弊?

c c++ static

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

使用setx后如何检索值?

我需要存储一个值(时间戳),然后在批处理文件中检索它.所以我搜索了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)

如何检索我的存储值?

windows batch-file

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

传递右值作为参考

我有一些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. 为什么这是错的?
  2. 什么是高效/优雅(可读)的解决方案?

c++ qt rvalue-reference c++11

8
推荐指数
2
解决办法
3774
查看次数

Visual Studio代码重构似乎不起作用(例如,重命名符号-f2)

所以我刚刚在版本1.27.2的ubuntu上安装了vscode。我也已经安装了c ++扩展。

一切正常,除了我似乎无法使用重构动作。具体来说,我想使用重命名符号(f2)。

当我单击一个变量并按f2时,没有任何反应。如果我执行ctrl + shift + r(重构操作),我总是会得到“没有可用的重构”。

我检查了键绑定,它显示为“ f2”:

  • 命令:重命名符号
  • 键绑定: F2
  • 来源:默认
  • 时间: editorHasRenameProvider && editorTextFocus &&!editorReadonly

因此,我检查了编辑器是否可写且文本具有焦点-都正确。但是我不确定该编辑器的重命名提供者是什么?

所以我需要安装其他东西吗?-如何进行重构?

c++ ubuntu refactoring visual-studio-code

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

Cargo rust 构建脚本 - 打印命令输出

我对 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-这不起作用。

我无法从那里的帖子中推断出答案(以及其他一些喜欢的帖子):

我觉得这一定很简单 - 但我已经在网上搜索了几个小时但没有找到答案。

command build-script rust rust-cargo

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

如何在doxygen中创建状态图?

使用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输出集成?

c++ doxygen

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

将const引用传递给临时/匿名lambda到std :: thread构造函数是否安全?

继这个问题之后:可以通过参考传递一段时间吗?

我有一个固定的代码片段:

// 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++ …

c++ lambda pass-by-reference stdthread

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

你能切换一个 std::any.type() 吗?

我想探索如何使用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++ any c++17

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