任何人都可以推荐任何用于C++代码的编译和运行时分析的工具吗?我日复一日地被要求识别在非常大的代码库中使用某些函数重载的位置.
我当前的方法涉及(a)使用grep/find进行文本搜索和(b)欺骗包含文件以注释掉有问题的重载,并完全重新编译从而破坏使用重载的构建.你可以想象这是非常耗时的.
顺便说一句,我在Red Hat Linux平台上这样做.
有没有办法,大概是使用模板,宏或两者的组合,我可以通常将一个函数应用于不同类的对象,但如果它们没有特定的功能,它们会以不同的方式响应吗?
我特别想要应用一个函数,如果对象具有该函数,将输出对象的大小(即集合中的对象数),但如果对象没有,则将输出一个简单的替换(例如"N/A") "T.即
NO_OF_ELEMENTS( mySTLMap ) -----> [ calls mySTLMap.size() to give ] ------> 10
NO_OF_ELEMENTS( myNoSizeObj ) --> [ applies compile time logic to give ] -> "N/A"
Run Code Online (Sandbox Code Playgroud)
我希望这可能类似于静态断言,尽管我显然想要编译不同的代码路径而不是在构建阶段失败.
我正在重构大量代码(主要是C++),以删除一些已经永久设置为给定值的临时配置检查.例如,我将拥有以下代码:
#include <value1.h>
#include <value2.h>
#include <value3.h>
...
if ( value1() )
{
// do something
}
bool b = value2();
if ( b && anotherCondition )
{
// do more stuff
}
if ( value3() < 10 )
{
// more stuff again
}
Run Code Online (Sandbox Code Playgroud)
对值的调用返回bool或int.因为我知道这些调用总是返回的值,所以我做了一些正则表达式替换以将调用扩展为它们的正常值:
// where:
// value1() == true
// value2() == false
// value3() == 4
// TODO: Remove expanded config (value1)
if ( true )
{
// do something
}
// TODO: Remove expanded config …
Run Code Online (Sandbox Code Playgroud) 我正在使用一个代码库,其中一个文件会自动生成并且非常频繁地更改。我发现对本地分支重新设置基准通常会导致回退到三种方式的合并并对该文件失败。然后,我必须修复文件并继续,但是在一次重新设置中可能会发生多次,并且由于文件的性质,手动解决冲突通常很麻烦。实际上,由于在尝试合并此特定文件时没有任何附加值,因此整个过程最终会陷入混乱和时间的浪费。
鉴于无论如何它都是在构建过程中重新创建的,有没有办法让我告诉Git在重新设置期间忽略此文件?
请注意,我已经查看了其他类似的问题/答案,但是没有看到任何专门解决此问题的方法(尽管如果有任何其他问题,请更正我。)此外,出于记录的原因,我不喜欢此类文件无论如何在版本控制中,但是恐怕我别无选择。
可有人请把我从我的苦难与此吗?我试图弄清楚为什么派生运算符==永远不会在循环中被调用.为了简化示例,这是我的Base和Derived类:
class Base { // ... snipped
bool operator==( const Base& other ) const { return name_ == other.name_; }
};
class Derived : public Base { // ... snipped
bool operator==( const Derived& other ) const {
return ( static_cast<const Base&>( *this ) ==
static_cast<const Base&>( other ) ? age_ == other.age_ :
false );
};
Run Code Online (Sandbox Code Playgroud)
现在当我像这样实例化和比较时......
Derived p1("Sarah", 42);
Derived p2("Sarah", 42);
bool z = ( p1 == p2 );
Run Code Online (Sandbox Code Playgroud)
... 一切都很好.这里调用了来自Derived的operator ==,但是当我循环遍历列表时,将指针列表中的项目与Base对象进行比较......
list<Base*> coll;
coll.push_back( …
Run Code Online (Sandbox Code Playgroud) 我有一个表格的数据文件:
Series_1 "12-Dec-2011 12:00" 32
Series_1 "12-Dec-2011 12:01" 29
Series_1 "12-Dec-2011 12:02" 27
Series_1 "12-Dec-2011 12:04" 23
Series_2 "12-Dec-2011 12:01" 45
Series_2 "12-Dec-2011 12:02" 43
Series_2 "12-Dec-2011 12:04" 38
Run Code Online (Sandbox Code Playgroud)
我想使用gnuplot在同一个图上绘制一些系列,但我是gnuplot的新手,我无法弄清楚该using
子句应该如何构造.
我想将第2列,日期/时间绘制为X轴,第3列为Y轴,后续部分重叠.这可能吗?当然X轴并不总是在第一列?
我试过了:
plot "datafile.dat" using 2:3 title 'Hits'
Run Code Online (Sandbox Code Playgroud)
但得到了错误:
x range is invalid
Run Code Online (Sandbox Code Playgroud)
有谁能告诉我哪里出错了?
我正在尝试编写一个相当简洁的sed脚本来删除文件的前两行,只有它们是空的,所以下面的文件:
> cat myfile.in
Line 3
Line 5
Run Code Online (Sandbox Code Playgroud)
会导致三行输出文件:
> cat myfile.out
Line 3
Line 5
Run Code Online (Sandbox Code Playgroud)
这涉及到行范围和模式匹配的组合,我似乎无法找到任何这样的例子.如果有人可以建议并且同样(或更多)建议Perl替代方案,我也会感到有兴趣.非常感谢.
脚注
我应该补充一点,我尝试1,2{/^$/d}
过在Linux上运行得非常好,但在AIX下我得到了:
sed: 0602-404 Function 1,2{/^$/d} cannot be parsed.
Run Code Online (Sandbox Code Playgroud)
在Solaris上我得到了:
sed: command garbled: 1,2{/^$/d}
Run Code Online (Sandbox Code Playgroud)
这是一个打击,因为此代码必须在AIX和Solaris上运行,而不是Linux!耻辱!
之前没有使用过set_intersection,但我相信它可以用于地图.我编写了以下示例代码,但它没有给出我期望的内容:
#include <map>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
struct Money
{
double amount;
string currency;
bool operator< ( const Money& rhs ) const
{
if ( amount != rhs.amount )
return ( amount < rhs.amount );
return ( currency < rhs.currency );
}
};
int main( int argc, char* argv[] )
{
Money mn[] =
{
{ 2.32, "USD" },
{ 2.76, "USD" },
{ 4.30, "GBP" },
{ 1.21, "GBP" },
{ 1.37, "GBP" }, …
Run Code Online (Sandbox Code Playgroud) 我正在查看一些已被移植并且无法编译的代码.代码以类似"C"的方式编写,并传递函数指针以便在对象上设置特定的mutator.正在填充的对象声明如下:
class Person
{
std::string n_;
int a_;
public:
void name( const std::string& n ) { n_ = n; }
std::string name() const { return n_; }
void age( const int& a ) { a_ = a; }
int age() const { return a_; }
};
Run Code Online (Sandbox Code Playgroud)
相当标准的东西.然后我们有一些有趣的功能,我为了简洁而修剪了它们:
typedef void (Person::FnSetStr)(const std::string& s);
typedef void (Person::FnSetInt)(const int& i);
void setMem( const std::string& label, Person* person, FnSetStr fn)
{
// Do some stuff to identify a std::string within a message from the …
Run Code Online (Sandbox Code Playgroud) 我从Sun C++ 5.10编译器那里得到一个关于我正在改变的一些现有代码中的隐藏虚拟方法的编译警告.无论出于何种原因,作者都没有为给定的数据类型实现函数的覆盖.我在这里重新创建了这种情况:
// First the data types
struct Shape {};
struct Square : public Shape {};
struct Circle : public Shape {};
struct Triangle : public Shape {};
// Now the visitor classes
struct Virtual
{
virtual ~Virtual() {}
virtual void visit( Square& obj ) {}
virtual void visit( Circle& obj ) {}
virtual void visit( Triangle& obj ) {}
};
struct Concrete : public Virtual
{
void visit( Square& obj ) {}
void visit( Circle& obj ) {} …
Run Code Online (Sandbox Code Playgroud)