假设我有一个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)文件中声明了(从而替换它的事物),那会发生什么变化(如果是,则如何改变)呢?
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?
我们正在使用 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++代码库,并且正在重构它以使其更好地形成.
最近有人建议我们扩展我们的函数命名约定(可能)抛出异常,以便更容易确定 - 一目了然 - 函数是否可能throw异常(通过调用函数直接或间接throw).
虽然我发现能够更容易地获得信息的能力是完整的,但我不能动摇这种可能导致麻烦的感觉,因为没有工具辅助的方式来验证和执行该约定 - 因此你不能真正依赖于惯例(除了它给出了提示).
由于我对此感到沮丧和不确定,所以我决定从这里寻求建议:
那么,使用这样的命名约定是一个好主意/值得努力,并且是否有既定的约定?
我刚刚在代码库中发现了以下构造(在示例中简化):
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)
我的怀疑是否正确?