小编Cra*_*rks的帖子

使Doxygen读取双斜杠C++注释作为标记

我正在尝试在我们庞大的78,000文件C++代码库上设置自动Doxygen运行.它可以提取基本类型和层次结构信息,但我想更好地了解已经存在的文档注释.

多年来积累的大多数评论都遵循一般模式,尽管不是Doxygen预期的模式.他们大多看起来像

// class description
class foo
{
   // returns ascii art of a fruit
   const char* apples( void ); 

   // does something to some other thing
   customtype_t baz( foo &other );

   enum
   {
      kBADGER, // an omnivorous mustelid
      kMUSHROOM, // tasty on pizza
      kSNAKE,  // oh no!
   };
}
Run Code Online (Sandbox Code Playgroud)

这是双重削减,而不是Doxygen期望的/////!风格评论.

搜索和替换所有这些评论的文件太多了,而且我的许多程序员对于在代码中看到三重斜杠都非常过敏,所以我想找到一些方法让Doxygen读取普通评论作为JavaDoc评论,当他们在正确的地方.有没有一种方法,使Doxygen的阅读//作为///

我找不到任何这样的配置参数,所以我想我需要以某种方式转换输入.一般来说,我使用的规则是:

  • 如果有一行只包含注释,紧接在函数/类/类型/变量声明之前,则假定它是/// 注释.
  • 如果// 评论在同一行后面有声明,则将其视为a///<

但我不知道怎么去教Doxygen这条规则.我能想到的两种方式是:

  1. 将程序编写为INPUT_FILTER,它解析输入C++并将//s转换为///s,如上所述.但是这种转换太复杂了,不能作为正则表达式,我真的不想写一个完整的C++解析器只是为了将输入提供给另一个C++解析器!此外,为每个文件启动一个INPUT_FILTER程序会降低Doxygen的速度:在我们的源代码中运行已超过30分钟,并且添加一个INPUT_FILTER …

c++ doxygen

18
推荐指数
1
解决办法
1730
查看次数

可以将std :: function从rvalue引用移动构造到临时的functor对象吗?

我有一个untemplated仿函数对象,我试图存储为std::function另一个对象内部.这个对象非常重量级,因此它被标记为不可复制,但它确实有一个移动构造函数.但是,尝试从临时构造函数构造std :: function或分配它失败.

这是引发错误的最小示例.

// pretend this is a really heavyweight functor that can't be copied.
struct ExampleTest
{
    int x;
    int operator()(void) const {return x*2;}
    ExampleTest(  ) :x(0){}
    ExampleTest( int a ) :x(a){}

    // allow move
    ExampleTest( ExampleTest &&other ) :x(other.x) {};

private: // disallow copy, assignment
    ExampleTest( const ExampleTest &other );
    void operator=( const ExampleTest &other );
};

// this sometimes stores really big functors and other times stores tiny lambdas.
struct ExampleContainer
{
    ExampleContainer( int …
Run Code Online (Sandbox Code Playgroud)

c++ std rvalue-reference c++11

18
推荐指数
1
解决办法
2627
查看次数

需要重写虚函数来调用基本实现

在C++类层次结构中,是否可以强制要求特定虚函数始终调用其基类的实现?(就像构造函数链的方式?)

我正在研究一个深层次层次结构具有一些通用接口函数的情况,每个子类都覆盖它们.我希望每个派生类'覆盖链接到基类.使用例如下面的代码明确地执行此操作是直截了当的,但实现新派生类的人可能会忘记链接到基础.

是否有一些模式来强制执行此操作,如果覆盖无法链接基础,编译器将抛出错误?

所以,在

class CAA 
{
   virtual void OnEvent( CEvent *e ) { 
     // do base implementation stuff;
   }
}

class CBB : public CAA
{
   typedef CAA BaseClass;
   virtual void OnEvent( CEvent *e ) { 
       DoCustomCBBStuff();
       BaseClass::OnEvent( e ); // chain to base
   }
}

class CCC : public CBB
{
   typedef CBB BaseClass;
   virtual void OnEvent( CEvent *e ) { 
       Frobble();
       Glorp();
       BaseClass::OnEvent( e ); // chain to CBB which chains to CAA, etc
   } …
Run Code Online (Sandbox Code Playgroud)

c++

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

我可以使用Boost 1.55构建双向协程吗?

目前的Boost 1.55实现提供了两种单向协同程序.一个是pull-type,它是一个不带参数的协程并将值返回给主上下文; 另一种是push-type,它是一个从主要上下文接受参数但没有返回值的协程.

如何组合这两个来创建一个双向协程,它既接受参数又返回一个值?从表面上看似乎应该是可能的,但我无法弄清楚如何使用我所拥有的构建块来实现它boost::coroutine.在旧的Boosts中曾经有过双向协程,但它现在已被弃用且没有文档,因此我不应该依赖它.

即,我想要一些类似于此的东西:

void accumulate( pull_func &in, push_func &out )
{
  int x = 0;
  while ( in ) 
  {
    x += in.get() ; // transfers control from main context 
    out(x); // yields control to main context
  }
}

void caller( int n ) 
{
   bidirectional_coro( accumulate );
   for ( int i = 0 ; i < n ; ++i )
   {
      int y = accumulate(i); 
      printf( "%d ", y ); // "0 1 …
Run Code Online (Sandbox Code Playgroud)

c++ boost coroutine

15
推荐指数
1
解决办法
983
查看次数

模板化无分支int max/min函数

我正在尝试编写一个无分支函数来返回两个整数的MAX或MIN而不求助于if(或?:).使用通常的技术,我可以很容易地为给定的字大小做到这一点:

inline int32 imax( int32 a, int32 b )
{
    // signed for arithmetic shift
    int32 mask = a - b;
    // mask < 0 means MSB is 1.
    return a + ( ( b - a ) & ( mask >> 31 ) );
}
Run Code Online (Sandbox Code Playgroud)

现在,假设arguendo我真的在那种必要的有序处理器上编写那种应用程序,我的问题是是否有办法使用C++模板将其推广到所有大小的int.

>> 31步仅适用于int32s,当然,虽然我可以对INT8,INT16和Int64的功能复制出来过载,好像我应该用一个模板函数.但是如何以位为单位获取模板参数的大小?

有没有比这更好的方法呢?我可以强制对面具T进行签名吗?如果T是无符号的,则掩码移位步骤将不起作用(因为它将是逻辑而不是算术移位).

template< typename T > 
inline T imax( T a, T b )
{
    // how can I force this T to be …
Run Code Online (Sandbox Code Playgroud)

c++ performance templates bit-manipulation

12
推荐指数
2
解决办法
4092
查看次数

仅使用恒定位移来模拟可变位移?

我试图找到一种方法来执行间接左移/右移操作而不实际使用变量移位操作或任何分支.

我正在研究的特定PowerPC处理器有一个怪癖,即按常数立即移位,就像

int ShiftByConstant( int x ) { return x << 3 ; } 
Run Code Online (Sandbox Code Playgroud)

是快速的,单操作的,超标量的,而变量的变换,如

int ShiftByVar( int x, int y ) { return x << y ; }
Run Code Online (Sandbox Code Playgroud)

是一个微编码操作,需要7-11个周期才能执行,而管道的其余部分都停止运行.

我想要做的是弄清楚哪个非微码整数PPC操作sraw解码然后单独发出它们.这对sraw自身的延迟没有帮助- 它将用六个替换一个操作 - 但在这六个操作之间我可以将一些工作双重调度到其他执行单元并获得净增益.

我似乎无法找到μopssraw解码到的任何地方 - 有谁知道如何用一系列常量移位和基本整数运算替换变量位移?(for循环或开关或其中带有分支的任何东西都不会起作用,因为分支惩罚甚至比微码惩罚更大,即使对于正确预测的分支也是如此.)

这无需在装配中回答; 我希望学习算法而不是特定的代码,所以用C语言或高级语言甚至伪代码的答案都会非常有用.

编辑:我应该补充一些说明:

  1. 我甚至不担心可移植性
  2. PPC具有条件移动,因此我们可以假设存在无分支内部函数

    int isel(a, b, c)  { return a >= 0 ? b : c; }
    
    Run Code Online (Sandbox Code Playgroud)

    (如果你写出一个做同样事情的三元组,我会明白你的意思)

  3. 整数乘法也是微编码甚至比慢sraw.:-(
  4. 在Xenon PPC上,预测分支的延迟是8个周期,因此即使是一个也使得它与微编码指令一样昂贵.跳转到指针(任何间接分支或函数指针)是一个保证的错误预测,一个24周期停顿.

c performance assembly bit-manipulation powerpc

12
推荐指数
2
解决办法
3905
查看次数

为什么AngularJS被认为不适合GUI编辑器应用?

在为项目评估AngularJS时,我注意到其文档中的以下段落:

游戏和GUI编辑器是非常密集和棘手的DOM操作的例子.这些类型的应用程序与CRUD应用程序不同,因此不适合Angular.在这些情况下,使用更接近裸机的东西(如jQuery)可能更合适.

但是文档继续没有真正解释为什么会这样.为了对我们为项目使用什么技术做出明智的决定,我想更好地了解这个陈述的来源以及它背后的事实.

有什么具体的问题会妨碍有人试图建立插图工具,或视频编辑套件,在AngularJS?

javascript angularjs

12
推荐指数
1
解决办法
2227
查看次数

在MSVC中强制未对齐的位域打包

我有一个位域结构,最多可以加48位.在GCC上,这正确地导致了6字节结构,但在MSVC中,结构出现了8个字节.我需要找到一些方法来强制MSVC正确打包结构,这既可以实现互操作性,也可以用于内存关键环境.

下面看到的结构由三个15位数字,一个2位数字和一个1位符号组成.15 + 15 + 15 + 2 + 1 = 48,理论上它应该适合六个字节,对吗?

struct S
{
  unsigned short a:15;
  unsigned short b:15;
  unsigned short c:15;
  unsigned short d:2;
  unsigned short e:1;       
};
Run Code Online (Sandbox Code Playgroud)

但是,在GCC和MSVC上对此进行编译会导致sizeof(S) == 8.认为这可能与对齐有关,我尝试#pragma pack(1)在struct声明之前使用,告诉编译器返回到byte,而不是int,bound.在海湾合作委员会,这工作,导致sizeof(S) == 6.

但是,在MSVC05上,sizeof仍然是8,即使pack(1)设置了!看完这个其他SO回答,我试图替换unsigned short dunsigned charunsigned short ebool.结果是sizeof(S)== 7!

我发现如果我将d分成两个一位字段并将它们夹在其他成员之间,那么结构最终会正确打包.

struct S
{
  unsigned short a:15;
  unsigned short dHi : …
Run Code Online (Sandbox Code Playgroud)

c c++ visual-studio

11
推荐指数
2
解决办法
3258
查看次数

整数除以零的平台会触发浮点异常?

在另一个问题中,有人想知道为什么他们得到一个"浮点错误",实际上他们的C++程序中有一个整数除零.围绕这一点进行了讨论,其中一些断言浮点异常实际上从未因浮点除以零而增加,而只是在整数除以零时出现.

这听起来很奇怪,因为我知道:

  1. 所有Windows平台上x86和x64上的MSVC编译代码报告int除以零为"0xc0000094:整数除以零",浮点除以零为0xC000008E"浮点除以零"(启用时)

  2. IA-32和AMD64 ISA指定#DE(整数除法异常)作为中断0.浮点异常触发中断16(x87浮点)或中断19(SIMD浮点).

  3. 其他硬件具有类似的不同中断(例如, PPC在float-div-by上引发0x7000并且根本不捕获int/0).

  4. 我们的应用程序使用_controlfp_s内部(最终stmxcsr操作)取消屏蔽零除零的浮点异常,然后捕获它们以进行调试.所以我在实践中肯定会看到IEEE754被零除的异常.

因此,我得出结论,有些平台将异常作为浮点异常报告,例如x64 Linux(无论ALU管道如何,都会针对所有算术错误提升SIGFPE).

其他操作系统(如果您操作系统,还是C/C++运行时)报告整数除零作为浮点异常?

c c++ error-handling x86-64 divide-by-zero

11
推荐指数
2
解决办法
2302
查看次数

在Mathematica中求解向量方程

我试图弄清楚如何使用Mathematica来求解方程组,其中一些变量和系数是向量.一个简单的例子就是这样的

A + Vt = Pt

我知道A,VP的大小,我必须求解t和P 的方向.(基本上,给出两条光线A和B,我知道关于A的所有内容,但只知道B的起源和大小) ,弄清楚B的方向必须是什么,使它与A相交.)

现在,我知道如何手动解决这类问题,但这很慢且容易出错,因此我希望我可以使用Mathematica来加快速度并对错误进行检查.但是,我看不出如何让Mathematica象征性地解决涉及这样的向量的方程.

我查看了VectorAnalysis软件包,但没有发现任何看似相关的东西; 同时线性代数包似乎只有线性系统的求解器(这不是,因为我不知道tP,只是| P |).

我尝试做一些简单的事情:将矢量扩展到它们的组件中(假装它们是3D)并解决它们,好像我试图将两个参数函数等同起来,

Solve[ 
      { Function[t, {Bx + Vx*t, By + Vy*t, Bz + Vz*t}][t] == 
          Function[t, {Px*t, Py*t, Pz*t}][t],
        Px^2 + Py^2 + Pz^2 == Q^2 } , 
      { t, Px, Py, Pz } 
     ]
Run Code Online (Sandbox Code Playgroud)

但是吐出的"解决方案"是系数和拥塞的混乱.它还迫使我扩展我喂它的每个维度.

我想要的是点产品,交叉产品和规范方面的一个很好的符号解决方案:

替代文字

但我看不出如何判断Solve一些系数是向量而不是标量.

这可能吗?Mathematica可以给我矢量符号解决方案吗?或者我应该坚持使用No.2 Pencil技术?

(为了清楚起见,我对顶部特定方程的解决方案不感兴趣 - 我问我是否可以使用Mathematica来解决计算几何问题,因为通常不需要将所有内容表达为显式矩阵{Ax, Ay, Az}等)

wolfram-mathematica linear-algebra

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