小编Ned*_*Ned的帖子

代码格式化:排队类似的线路好吗?

我最近发现我们公司有一套编码指南(隐藏在文档管理系统中,没有人能找到它).它通常看起来非常明智,并且远离通常的宗教战争,关于在哪里放置'{以及是否使用硬标签.但是,它确实表明"行不应包含嵌入的多个空格".这意味着不要做这种事情:

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)

对此的理由是,对一行的更改通常需要编辑每一行.这使得改变更加努力,并且更难理解差异.

我被撕裂了.一方面,像这样排列可以使重复代码更容易阅读.另一方面,它确实使差异难以阅读.

你对此有何看法?

formatting coding-style

19
推荐指数
7
解决办法
3633
查看次数

在C中,如果B是易失性的,那么表达式(void)(B = 1)应该读取B.

我在几个嵌入式平台的编译器上工作.用户最近抱怨我们的一个编译器出现以下行为.给出这样的代码:

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,则添加只读是正确还是有用?

c volatile c99 variable-assignment

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

gcc中的--host和--target有什么区别?

构建知道有三个系统名称:您正在构建的机器(构建),您正在构建的机器(主机),以及GCC将为(目标)生成代码的机器.配置GCC时,请使用'--build =',' - host ='和'--target ='指定它们.

是不是the machine that you are building forthe machine that GCC will produce code for同样的事情?有什么不同?

gcc cross-compiling

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

g ++拒绝我的简单仿函数"预期类型,得到'xyz'"

我一直在玩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.

c++ templates g++ functor

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

当我的应用程序锁定客户的计算机时崩溃报告监视程序

我正在使用一个有点不可靠的(Qt/windows)应用程序,部分是由第三方为我们编写的(只是试图将责任转移到那里).他们的最新版本更稳定.有点.我们收到的崩溃报告越来越少,但是我们收到很多关于崩溃的报告并且永远不会回来.情况多种多样,由于我们可以收集的信息很少,我们无法重现这些问题.

理想情况下,我想创建某种看门狗,注意到应用程序已锁定,并提供向我们发送崩溃报告.好主意,但有问题:

  • 看门狗如何知道该过程已挂起?据推测,我们会对应用程序进行检测,以便定期对看门狗说"一切正常",但是我们在哪里放置它以保证频繁发生,但不太可能出现在应用程序结束时的代码路径上锁定.

  • 发生崩溃时看门狗应该报告什么信息?Windows有一个不错的调试api,所以我相信所有有趣的数据都是可访问的,但我不确定什么对于追踪问题有用.

crash-reports watchdog crash-dumps

4
推荐指数
1
解决办法
1406
查看次数