小编Cha*_*onX的帖子

杀死魔术数字:“ const int” vs“ constexpr int”(或最后没有区别)

假设我有一个magic number想要摆脱的...

//whatever.cpp

for (int i = 0; i < 42; i++)
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

我可以通过两种方式杀死它:

在源文件中带有const int SOMETHING_SOMETHING_MEANING_OF_LIFE = 42
或带有。constexpr int SOMETHING_SOMETHING_MEANING_OF_LIFE = 42
.cpp

在这种情况下,两者之间是否有任何有意义的区别(我记得编译器推断出-在任何一种情况下-值均未更改,因此42实际上将其硬编码在结果循环/展开循环/任何机器代码中)或归结为个人品味吗?

在一个相关的问题中:如果magic number在标头(.h)文件而不是源(.ccp)文件中声明了(从而替换它的事物),那会发生什么变化(如果是,则如何改变)呢?

c++ const magic-numbers constexpr

13
推荐指数
2
解决办法
943
查看次数

我可以使用常量定义数组的长度,那么为什么不这样做呢?

    int a = 5;
    const int b = a, c = 4;

    int e[a];
    int d[b];
    int f[c];
Run Code Online (Sandbox Code Playgroud)

的定义f[c]有效。
变量b也是恒定的int,但是编译器给我的错误“表达必须有一个恒定的值”为线int d[b]b和之间有什么区别c

c++

10
推荐指数
2
解决办法
153
查看次数

是否可以使用 Qt Designer 的依赖注入(对于 .ui 文件)?

我们正在使用 Visual Studio 2015 和 Qt Designer 进行 UI 开发(通过 Form / .ui 文件)。

我们现在需要在 UI 元素之间共享一些通用数据(例如最近使用的路径等),我想通过依赖注入(即在构建期间为 UI 提供对通用对象的引用)而不是例如( ab)使用单例模式。

有人面临(并解决)类似的问题吗?有没有明智的方法来做到这一点?

更新(详细说明):
例如,我有一个自定义FooWidget,我希望在我的表单文件中使用FooDialog.ui

// My custom Widget
class FooWidget : public QWidget {
    Q_OBJECT
  public:
    FooWidget(QWidget* parent);
    //...
}

// The FooDialog class (scaffolding created by Qt Designer)
class FooDialog : public QDialog {
    Q_OBJECT
  public:
    FooDialog(QWidget* parent) : QDialog(parent), ui (new Ui::FooDialog()) {
      ui->setupUp(this);
      //...
  }

  private:
    Ui::FooDialog* ui;
}

// The Ui::FooDialog class autogenerated(!) …
Run Code Online (Sandbox Code Playgroud)

c++ qt dependency-injection qt-designer visual-studio

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

抛出异常(C++)的方法的命名约定?

我们正在开发一个中型到大型的C++代码库,并且正在重构它以使其更好地形成.

最近有人建议我们扩展我们的函数命名约定(可能)抛出异常,以便更容易确定 - 一目了然 - 函数是否可能throw异常(通过调用函数直接或间接throw).

虽然我发现能够更容易地获得信息的能力是完整的,但我不能动摇这种可能导致麻烦的感觉,因为没有工具辅助的方式来验证和执行该约定 - 因此你不能真正依赖于惯例(除了它给出了提示).

由于我对此感到沮丧和不确定,所以我决定从这里寻求建议:
那么,使用这样的命名约定是一个好主意/值得努力,并且是否有既定的约定?

c++ exception naming-conventions

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

一个线程设置成员而另一个线程遍历它 - 这个线程不安全吗?

我刚刚在代码库中发现了以下构造(在示例中简化):

class SomeClass
{
  public:
    void setKeepGoing(bool b) { m_keepGoing = b; }
    void setDoAdditionalStuff(bool b) { m_doAdditionalStuff = b; }
    void someLoop()
    {
        while(m_keepGoing) 
        {
            //Do something
            bool doMore = m_doAdditionalStuff;
            if (doMore)
                //Do more things
        }  
    }

  private:
    bool m_keepGoing;
    bool m_doAdditionalStuff;
}
Run Code Online (Sandbox Code Playgroud)

有多个线程,一个呼叫,someLoop()而其他线程呼叫setKeepGoing()和/或setDoAdditionalStuff().

现在我的直觉是,这是非常不安全的线程.编译器可以很好地优化m_doAdditionalStuff循环内部的读取(因为它没有在那里改变),甚至m_keepGoing(因为它也没有在那里改变)有效地导致代码表现如下:

void someLoop()
{
    if (!m_keepGoing)
        return;
    bool doMore = m_doAdditionalStuff;
    while(true) 
    {
        //Do something
        if (doMore)
            //Do more things
    }  
}
Run Code Online (Sandbox Code Playgroud)

我的怀疑是否正确?

c++ optimization multithreading

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