小编Kar*_*oll的帖子

如果声明 - 短路评估与可读性

有时,if语句可能相当复杂或冗长,因此为了便于阅读,最好在之前提取复杂的调用if.

例如:

if (SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall())
{
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

进入这个

bool b1 = SomeComplicatedFunctionCall();
bool b2 = OtherComplicatedFunctionCall();

if (b1 || b2)
{
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

(提供示例并不是那么糟糕,它仅用于说明...想象其他具有多个参数的调用等)

但是通过这种提取,我失去了短路评估(SCE).

  1. 我每次真的失去了SCE吗?是否存在允许编译器"优化"并仍提供SCE的情况?
  2. 有没有办法保持第二个片段的可读性提高而不会失去SCE?

c++ if-statement side-effects short-circuiting

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

为什么STL/Boost C++编码风格与众不同?

我是一名相当新秀的C++程序员,但由于我对该语言的经验有限,大多数标准C++风格指南(例如Google C++样式指南)都与stl和boost库中实现的内容相悖.

例如,在C++标准库和升压类名称总是小写,用下划线分隔的话(例如std::vector,boost::unordered_map,std::map::const_iterator),而多数风格指南我已经看到了C++向驼峰样式(如倾向于TcpConnectionInt32).

这同样适用于方法.标准库和Boost使用与类(例如std::map<>::get_equal("foo"))相同的方法和函数样式,而大多数样式指南使用pascalCase或CamelCase.

如果我们将这与像Ruby这样的语言形成对比,大多数用户都会遵循核心库中使用的约定,那么标准C++库和其他人的代码之间会有这样的差异,这似乎很奇怪.

有人知道为什么吗?

编辑:只是为了澄清,我只是简单地谈论肤浅的文本风格(套管,使用下划线等)而不是实际的实现风格.

c++ coding-style naming-conventions

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

有没有一种简单的方法来初始化一个没有构造函数的简单类?

我有一个非常简单的类,像这样:

class MySimpleClass
{
public:
    uint16_t   m_myInt;
    String     m_myString;
    String     m_myOtherString;
    MyEnum     m_myEnumValue;
    bool       m_myBool;
};
Run Code Online (Sandbox Code Playgroud)

这个类是我无法更改的预编译库的一部分,它不提供构造函数.有什么方法可以初始化这个类而不必做这样的事情......

MySimpleClass msc;
msc.m_myInt = 1;
msc.m_myString = "foo";
msc.m_myOtherString = "bar";
msc.m_myEnumValue = ENUM_VALUE_YES;
msc.m_myBool = true;
Run Code Online (Sandbox Code Playgroud)

我并不反对这样做,但我很想知道是否有某种初始化语法可以做到这一点?

我在C++ 03工作,但C++ 11中的答案也会引起人们的兴趣.

c++

25
推荐指数
3
解决办法
1846
查看次数

Delphi - 如何防止Forms/MsgBox在先前的表单下移动?

很多时候,在Windows 98时代之后,我们经历过一些对话框丢失了Z-Order并返回到之前的形式.

例如:

Dialog1.ShowModal;

Dialog1.OnClickButton() : ShowMessage('anything');
Run Code Online (Sandbox Code Playgroud)

当MessageBox出现时,它有时没有焦点,并在Dialog1下移动.用户对此感到困惑,他们说:我的申请冻结了!但是如果他们使用Alt + Tab移动到另一个应用程序并返回,焦点将返回到MessageBox,它将成为前景窗口.

我们通过ShowMessage,MessageBox,普通表单以及QuickReport表单体验过这一点.

有谁知道这个?这是一个Windows bug吗?你怎么能阻止它?怎么抓住这个?

谢谢你的帮助:dd


我真的说过,在Win98之后,所有操作系统(Win7也)都会受到这个问题的影响.我们使用Delphi 6 Prof,因此属性不能使用Default表单.

有人说使用MessageBox + MB_APPLMODAL可以控制消息对话框.这是个好消息,但我们有许多旧的表单和组件,第三方工具.

因此,通过替换表单来创建一个全新的应用程序是一项艰苦的工作.

但我们会尝试这样做.

我认为答案是这是半个应用程序问题和半个Windows问题.如果Windows有时会处理此问题,有时则不会 - 这似乎是一个Windows错误.但是,如果我们可以强制制作良好的模态窗口,那么它就是编程错误.

有人可以向我解释一下WS_POPUP标志的含义是什么?它有副作用吗?

谢谢:dd

windows delphi dialog z-order delphi-6

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

gdb将内存地址解释为对象

我正在根据可用的核心转储调查崩溃.应用程序崩溃是一个C++程序,使用gcc构建并在RH5上运行.回溯似乎有效,直到#1帧.试图打印我得到的对象 <invalid address>, <error reading variable> 因为我从#2帧获得对象的地址是一个有效的假设,我可以以某种方式"转储"分配对象的内存并仍然收集一些信息.此外,我可以强制gdb打印地址,就好像它是一个对象,而不是试图猜测对象是如何对齐的,即使它检测到一些错误.我的想法是,对象可能已被删除,但也许内存仍然存在,我可以打印一些成员变量.

请评论是否可能,如果是的话,应该如何用gdb术语来完成.10X.

c++ linux gdb

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

操作数类型不兼容("char"和"const char*")

我收到以下错误...

操作数类型不兼容("char"和"const char*")

...当试图执行if语句时.我假设我不理解输入值是如何存储的,虽然我不确定我是否可以将其转换为匹配类型?

要重现的示例代码是:

char userInput_Text[3];

if (userInput_Text[1] == "y") {
    // Do stuff.
}
Run Code Online (Sandbox Code Playgroud)

我不确定是什么导致了这个.看起来一个类型是char而另一个是const char指针,虽然我不确定是什么,作为参考,当我不使用数组时也会发生这个错误).

提示/反馈将非常感激.

c c++ arrays types

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

有没有一种简单的方法来获得用C++打印的字符数?

printf(...)返回输出到控制台的字符数,我发现在设计某些程序时非常有帮助.所以,我想知道C++中是否有类似的功能,因为cout <<是一个没有返回类型的运算符(至少根据我的理解).

c++ printf iostream cout console-application

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

std :: move()是否使迭代器无效?

考虑以下程序:

struct list_wrapper
{
    std::vector<int>    m_list;
};

int main()
{
    std::vector<int> myList { 1, 1, 2, 3, 5 };

    const std::vector<int>::iterator iter = myList.begin();

    list_wrapper wrappedList;
    wrappedList.m_list = std::move(myList);

    // Can I still dereference iter?

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在调用之后std::move(myList),iter现在指向内部的有效项wrappedList.m_list,或者移动构造函数/赋值使所有迭代器无效?

c++ iterator undefined-behavior move-semantics c++11

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

是否可以验证IMEI号码?

对于移动商店应用程序,我需要验证IMEI号码.我知道如何基于输入长度进行验证,但是他们是否有其他任何验证输入数字的机制?有没有可以实现这一目标的内置功能?

任何语言的逻辑都被接受和赞赏.

c vb.net imei

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

如何练习Visual Studio 2013降级权利?

我有一份Visual Studio 2013,虽然我主要使用它,但我必须使用一个尚未正式支持Visual Studio 2013的特定C++ SDK,因此我希望使用我的Visual Studio降级来安装Visual Studio 2012权利.

根据Microsoft许可信息,这应该是可能的:

对于Visual Studio Professional,许可证中包含的软件是该软件的当前版本,Visual Studio Professional 2013,以及同时运行您可以访问的Visual Studio Professional的早期版本的降级权限.

(强调我的)

我可以访问Visual Studio 2012的副本,但是我仍然被要求提供许可证密钥(我猜这是预期的).如何使用Visual Studio 2013许可证(如果有的话)许可我的Visual Studio 2012副本?

visual-studio visual-studio-2012 visual-studio-2013

6
推荐指数
1
解决办法
5607
查看次数