我正在尝试在我们庞大的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这条规则.我能想到的两种方式是:
//s转换为///s,如上所述.但是这种转换太复杂了,不能作为正则表达式,我真的不想写一个完整的C++解析器只是为了将输入提供给另一个C++解析器!此外,为每个文件启动一个INPUT_FILTER程序会降低Doxygen的速度:在我们的源代码中运行已超过30分钟,并且添加一个INPUT_FILTER …我有一个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++类层次结构中,是否可以强制要求特定虚函数始终调用其基类的实现?(就像构造函数链的方式?)
我正在研究一个深层次层次结构具有一些通用接口函数的情况,每个子类都覆盖它们.我希望每个派生类'覆盖链接到基类.使用例如下面的代码明确地执行此操作是直截了当的,但实现新派生类的人可能会忘记链接到基础.
是否有一些模式来强制执行此操作,如果覆盖无法链接基础,编译器将抛出错误?
所以,在
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) 目前的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) 我正在尝试编写一个无分支函数来返回两个整数的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) 我试图找到一种方法来执行间接左移/右移操作而不实际使用变量移位操作或任何分支.
我正在研究的特定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语言或高级语言甚至伪代码的答案都会非常有用.
编辑:我应该补充一些说明:
PPC具有条件移动,因此我们可以假设存在无分支内部函数
int isel(a, b, c) { return a >= 0 ? b : c; }
Run Code Online (Sandbox Code Playgroud)
(如果你写出一个做同样事情的三元组,我会明白你的意思)
sraw.:-(在为项目评估AngularJS时,我注意到其文档中的以下段落:
游戏和GUI编辑器是非常密集和棘手的DOM操作的例子.这些类型的应用程序与CRUD应用程序不同,因此不适合Angular.在这些情况下,使用更接近裸机的东西(如jQuery)可能更合适.
但是文档继续没有真正解释为什么会这样.为了对我们为项目使用什么技术做出明智的决定,我想更好地了解这个陈述的来源以及它背后的事实.
有什么具体的问题会妨碍有人试图建立如插图工具,或视频编辑套件,在AngularJS?
我有一个位域结构,最多可以加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 d用unsigned char和unsigned short e用bool.结果是sizeof(S)== 7!
我发现如果我将d分成两个一位字段并将它们夹在其他成员之间,那么结构最终会正确打包.
struct S
{
unsigned short a:15;
unsigned short dHi : …Run Code Online (Sandbox Code Playgroud) 在另一个问题中,有人想知道为什么他们得到一个"浮点错误",实际上他们的C++程序中有一个整数除零.围绕这一点进行了讨论,其中一些断言浮点异常实际上从未因浮点除以零而增加,而只是在整数除以零时出现.
这听起来很奇怪,因为我知道:
所有Windows平台上x86和x64上的MSVC编译代码报告int除以零为"0xc0000094:整数除以零",浮点除以零为0xC000008E"浮点除以零"(启用时)
IA-32和AMD64 ISA指定#DE(整数除法异常)作为中断0.浮点异常触发中断16(x87浮点)或中断19(SIMD浮点).
其他硬件具有类似的不同中断(例如, PPC在float-div-by上引发0x7000并且根本不捕获int/0).
我们的应用程序使用_controlfp_s内部(最终stmxcsr操作)取消屏蔽零除零的浮点异常,然后捕获它们以进行调试.所以我在实践中肯定会看到IEEE754被零除的异常.
因此,我得出结论,有些平台将异常作为浮点异常报告,例如x64 Linux(无论ALU管道如何,都会针对所有算术错误提升SIGFPE).
其他操作系统(如果您是操作系统,还是C/C++运行时)报告整数除零作为浮点异常?
我试图弄清楚如何使用Mathematica来求解方程组,其中一些变量和系数是向量.一个简单的例子就是这样的

我知道A,V和P的大小,我必须求解t和P 的方向.(基本上,给出两条光线A和B,我知道关于A的所有内容,但只知道B的起源和大小) ,弄清楚B的方向必须是什么,使它与A相交.)
现在,我知道如何手动解决这类问题,但这很慢且容易出错,因此我希望我可以使用Mathematica来加快速度并对错误进行检查.但是,我看不出如何让Mathematica象征性地解决涉及这样的向量的方程.
我查看了VectorAnalysis软件包,但没有发现任何看似相关的东西; 同时线性代数包似乎只有线性系统的求解器(这不是,因为我不知道t或P,只是| 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}等)