有时,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).
我是一名相当新秀的C++程序员,但由于我对该语言的经验有限,大多数标准C++风格指南(例如Google C++样式指南)都与stl和boost库中实现的内容相悖.
例如,在C++标准库和升压类名称总是小写,用下划线分隔的话(例如std::vector
,boost::unordered_map
,std::map::const_iterator
),而多数风格指南我已经看到了C++向驼峰样式(如倾向于TcpConnection
或Int32
).
这同样适用于方法.标准库和Boost使用与类(例如std::map<>::get_equal("foo")
)相同的方法和函数样式,而大多数样式指南使用pascalCase或CamelCase.
如果我们将这与像Ruby这样的语言形成对比,大多数用户都会遵循核心库中使用的约定,那么标准C++库和其他人的代码之间会有这样的差异,这似乎很奇怪.
有人知道为什么吗?
编辑:只是为了澄清,我只是简单地谈论肤浅的文本风格(套管,使用下划线等)而不是实际的实现风格.
我有一个非常简单的类,像这样:
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中的答案也会引起人们的兴趣.
很多时候,在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
我正在根据可用的核心转储调查崩溃.应用程序崩溃是一个C++程序,使用gcc构建并在RH5上运行.回溯似乎有效,直到#1帧.试图打印我得到的对象
<invalid address>, <error reading variable>
因为我从#2帧获得对象的地址是一个有效的假设,我可以以某种方式"转储"分配对象的内存并仍然收集一些信息.此外,我可以强制gdb打印地址,就好像它是一个对象,而不是试图猜测对象是如何对齐的,即使它检测到一些错误.我的想法是,对象可能已被删除,但也许内存仍然存在,我可以打印一些成员变量.
请评论是否可能,如果是的话,应该如何用gdb术语来完成.10X.
我收到以下错误...
操作数类型不兼容("char"和"const char*")
...当试图执行if语句时.我假设我不理解输入值是如何存储的,虽然我不确定我是否可以将其转换为匹配类型?
要重现的示例代码是:
char userInput_Text[3];
if (userInput_Text[1] == "y") {
// Do stuff.
}
Run Code Online (Sandbox Code Playgroud)
我不确定是什么导致了这个.看起来一个类型是char而另一个是const char指针,虽然我不确定是什么,作为参考,当我不使用数组时也会发生这个错误).
提示/反馈将非常感激.
printf(...)
返回输出到控制台的字符数,我发现在设计某些程序时非常有帮助.所以,我想知道C++中是否有类似的功能,因为cout <<是一个没有返回类型的运算符(至少根据我的理解).
考虑以下程序:
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
,或者移动构造函数/赋值使所有迭代器无效?
对于移动商店应用程序,我需要验证IMEI号码.我知道如何基于输入长度进行验证,但是他们是否有其他任何验证输入数字的机制?有没有可以实现这一目标的内置功能?
任何语言的逻辑都被接受和赞赏.
我有一份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副本?