我最近发现我们公司有一套编码指南(隐藏在文档管理系统中,没有人能找到它).它通常看起来非常明智,并且远离通常的宗教战争,关于在哪里放置'{以及是否使用硬标签.但是,它确实表明"行不应包含嵌入的多个空格".这意味着不要做这种事情:
foo = 1;
foobar = 2;
bar = 3;
Run Code Online (Sandbox Code Playgroud)
或这个:
if ( test_one ) return 1;
else if ( longer_test ) return 2;
else if ( shorter ) return 3;
else return 4;
Run Code Online (Sandbox Code Playgroud)
或这个:
thing foo_table[] =
{
{ "aaaaa", 0 },
{ "aa", 1 },
// ...
}
Run Code Online (Sandbox Code Playgroud)
对此的理由是,对一行的更改通常需要编辑每一行.这使得改变更加努力,并且更难理解差异.
我被撕裂了.一方面,像这样排列可以使重复代码更容易阅读.另一方面,它确实使差异难以阅读.
你对此有何看法?
我在几个嵌入式平台的编译器上工作.用户最近抱怨我们的一个编译器出现以下行为.给出这样的代码:
extern volatile int MY_REGISTER;
void Test(void)
{
(void) (MY_REGISTER = 1);
}
Run Code Online (Sandbox Code Playgroud)
编译器生成它(在伪汇编程序中):
Test:
move regA, 1
store regA, MY_REGISTER
load regB, MY_REGISER
Run Code Online (Sandbox Code Playgroud)
也就是说,它不仅写入MY_REGISTER,而且之后将其读回.由于性能原因,额外负载使他心烦意乱.我解释说这是因为根据标准"赋值表达式在赋值后具有左操作数的值,[...]".
奇怪的是,删除cast-to-void会改变行为:负载消失.用户很高兴,但我只是感到困惑.
所以我也在几个版本的GCC(3.3和4.4)中检查了这一点.在那里,编译器永远不会生成负载,即使明确使用该值,例如
int TestTwo(void)
{
return (MY_REGISTER = 1);
}
Run Code Online (Sandbox Code Playgroud)
变成
TestTwo:
move regA, 1
store regA, MY_REGISTER
move returnValue, 1
return
Run Code Online (Sandbox Code Playgroud)
有没有人对该标准的正确解释有何看法?回读是否应该发生?如果使用该值或将其转换为void,则添加只读是正确还是有用?
构建知道有三个系统名称:您正在构建的机器(构建),您正在构建的机器(主机),以及GCC将为(目标)生成代码的机器.配置GCC时,请使用'--build =',' - host ='和'--target ='指定它们.
是不是the machine that you are building for和the machine that GCC will
produce code for同样的事情?有什么不同?
我一直在玩C++中的仿函数.特别是,我有一个对的向量,我想根据该对的第一个元素排序.我开始编写一个完全专业的函子(例如"bool MyLessThan(MyPair&lhs,MyPair&rhs)").然后,仅仅因为这种东西很有趣,我想尝试编写一个通用的"将F应用于这对的第一个元素"仿函数.我写了下面的内容,但是g ++并不喜欢它.我明白了:
错误:模板参数列表中参数2的类型/值不匹配'template struct Pair1stFunc2'错误:预期类型,得到"更少"
#include <algorithm>
#include <functional>
#include <utility>
#include <vector>
template <class P, class F>
struct Pair1stFunc2
{
typename F::result_type operator()(P &lhs, P &rhs) const
{ return F(lhs.first, rhs.first); }
typename F::result_type operator()(const P &lhs, const P &rhs) const
{ return F(lhs.first, rhs.first); }
};
typedef std::pair<int,int> MyPair;
typedef std::vector<MyPair> MyPairList;
MyPairList pairs;
void foo(void)
{
std::sort(pairs.begin(),
pairs.end(),
Pair1stFunc2<MyPair, std::less>());
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释我在这里做错了什么吗?我知道这是一个有点人为的例子,但我想知道发生了什么,如果只是为了改善我的STL-fu.
我正在使用一个有点不可靠的(Qt/windows)应用程序,部分是由第三方为我们编写的(只是试图将责任转移到那里).他们的最新版本更稳定.有点.我们收到的崩溃报告越来越少,但是我们收到很多关于崩溃的报告并且永远不会回来.情况多种多样,由于我们可以收集的信息很少,我们无法重现这些问题.
理想情况下,我想创建某种看门狗,注意到应用程序已锁定,并提供向我们发送崩溃报告.好主意,但有问题:
看门狗如何知道该过程已挂起?据推测,我们会对应用程序进行检测,以便定期对看门狗说"一切正常",但是我们在哪里放置它以保证频繁发生,但不太可能出现在应用程序结束时的代码路径上锁定.
发生崩溃时看门狗应该报告什么信息?Windows有一个不错的调试api,所以我相信所有有趣的数据都是可访问的,但我不确定什么对于追踪问题有用.
c ×1
c++ ×1
c99 ×1
coding-style ×1
crash-dumps ×1
formatting ×1
functor ×1
g++ ×1
gcc ×1
templates ×1
volatile ×1
watchdog ×1