小编siv*_*udh的帖子

静态代码分析器:非托管C++ Visual Studio 2008

我在Visual Studio 2008上开发了商业非托管C++应用程序,我想添加一个静态代码分析工具.

有什么建议?

如果该工具可以集成到MSVC中,我认为这将是非常好的.

我正在考虑PC-Lint + Visual Lint

但是,我一直在认真研究Coverity,UnderstandingKlockwork.

价格不是真正的问题.我想要那些在MSVC上实际使用该工具进行非托管C++的人的意见,他们非常喜欢它.

最后,VSTS和Intel Parallel Studio现在还提供静态代码分析.尼斯〜

注意:相关帖子建议Coverity是最好的(?)(参见最后2篇帖子)

c++ static-analysis visual-studio visual-c++

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

Java:怎么不编译?

为什么这段代码不能编译?

class A
{
  class B
  {
    public enum Enum   <-- this line
    {
      AD,
      BC
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

编译报告:

enum declarations allowed only in static contexts.
Run Code Online (Sandbox Code Playgroud)

但是当我把Enum放在A级时,一切都还好.

这非常令人惊讶.我不认为我在C++中遇到这个问题.

java enums

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

定制容器要求与Qt的foreach一起使用

创建可与Qt foreach宏一起使用的自定义容器的最小代码量是多少?

到目前为止我有这个

template< class T >
class MyList
{
public:
  class iterator
  {
  public:

  };
  class const_iterator
  {
  public:
    inline iterator& operator++ ()
    {
      return *this;
    }
  };
};
Run Code Online (Sandbox Code Playgroud)

我收到这个编译器错误:

4>.\main.cpp(42) : error C2100: illegal indirection
4>.\main.cpp(42) : error C2440: 'initializing' : cannot convert from 'MyList<T>::const_iterator' to 'int'
4>        with
4>        [
4>            T=int
4>        ]
4>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Run Code Online (Sandbox Code Playgroud)

当我尝试编译这个:

  MyList<int> mylst;
  foreach(int num, mylst ) …
Run Code Online (Sandbox Code Playgroud)

foreach qt containers

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

Qt是否提供代表IP地址的类?

我认为QHostAddress是它,但奇怪的是它没有提供验证IP地址是否有效的方法(不再使用,已弃用到Qt3).

有人知道吗?

qt

8
推荐指数
2
解决办法
7969
查看次数

localhost vs LAN:速度差异?

我目前正在进行性能分析.我们有一个基本的客户/服务器应用程序 如果我在同一台计算机(localhost)上运行客户端/服务器而不是在LAN上的两台计算机上运行TCP传输速度会不同?

network-programming

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

这个JavaScript代码片段令人困惑

对于这个片段,我并不感到惊讶全局变量'a'的评估结果为5.

http://jsfiddle.net/MeiJsVa23/gZSxY/:

var a = 10;

function func(){
  a = 5;
}

func();   // expect global variable 'a' to be modified to 5;

alert(a); // and this prints out 5 as expected. No surprise here.
?
Run Code Online (Sandbox Code Playgroud)

但是为什么这个代码片段,全局变量'a'评估为10而不是5?就好像a = 5从未发生过一样.

http://jsfiddle.net/MeiJsVa23/2WZ7w/:

var a = 10;

function func(){
  a = 5;
  var a = 23;
}

func();   // expect global variable 'a' to be modified to 5;

alert(a); // but this prints out 10!! why?
Run Code Online (Sandbox Code Playgroud)

javascript

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

XQuery:如何在for循环中正确追加

所以我有这样的xml数据:

  <PhoneNumber>213-512-7457</PhoneNumber>
  <PhoneNumber>213-512-7465</PhoneNumber>
Run Code Online (Sandbox Code Playgroud)

和这个XQuery:

<PhoneNumberList>
{
  for $phone in $c//PhoneNumber
  let $phoneStr := ""
  return concat($phoneStr, $phone) 
}
</PhoneNumberList>
Run Code Online (Sandbox Code Playgroud)

我明白了:

<PhoneNumberList>213-512-7457213-512-7465</PhoneNumberList>
Run Code Online (Sandbox Code Playgroud)

但我真的想要:

<PhoneNumberList>213-512-7457, 213-512-7465</PhoneNumberList>
Run Code Online (Sandbox Code Playgroud)

有人可以说明如何做到这一点吗?

xquery

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

C++内部代码重用:编译所有内容还是共享库/动态库?

一般问题:

对于非托管C++,哪些内部代码共享更好?

  1. 通过共享实际源代码重用代码?要么
  2. 通过共享库/动态库(+所有头文件)重用代码

无论它是什么:减少重复代码(复制粘贴综合症)的策略是什么,代码膨胀?


具体例子:

以下是我们在组织中共享代码的方式:

我们通过共享实际的源代码来重用代码.

我们使用VS2008在Windows上开发,尽管我们的项目实际上需要跨平台.我们有许多项目(.vcproj)已提交到存储库; 有些可能有自己的存储库,有些可能是存储库的一部分.对于每个可交付的解决方案(.sln)(例如我们交付给客户的东西),它将svn:从存储库中外部所有必要的项目(.vcproj)来组装"最终"产品.

这很好用,但我很担心每个解决方案的代码大小最终会变得非常大(现在我们的总代码大小约为75K SLOC).

还有一点需要注意,我们会阻止所有传递依赖.也就是说,不是实际解决方案(.sln)的每个项目(.vcproj)都不允许svn:externals任何其他项目,即使它依赖于它.这是因为您可能有2个项目(.vcproj)可能依赖于同一个库(即Boost)或项目(.vcproj),因此当您将两个项目外部转换为单个解决方案时,svn:externals将执行两次.因此,我们会仔细记录每个项目的所有依赖项,并由创建解决方案(.sln)的人员来确保所有依赖项(包括传递)都是svn:externals作为解决方案的一部分.

如果我们通过使用.lib,.dll重用代码,这显然会减少每个解决方案的代码大小,并在适用的情况下消除上面提到的传递依赖性(例外,例如,使用的第三方库/框架) dll喜欢Intel TBB和默认Qt)


附录:(如果您愿意,请阅读)

GUI博士最好总结共享源代码的另一个动机:

最重要的是,C++简单易用的不是创建可重用的二进制组件; 相反,C++使得重用源代码变得相对容易.请注意,大多数主要的C++库都是以源代码形式提供的,而不是编译形式.通常需要查看该源以便从对象中正确继承 - 并且在重用它时依赖原始库的实现细节太简单(并且经常是必要的).好像这还不够糟糕,修改原始源并进行库的私有构建通常很诱人(或必要).(MFC有多少私人构建?世界永远不会知道......)

也许这就是为什么当你查看像Intel Math Kernel库这样的库时,在他们的"lib"文件夹中,每个Visual Studio版本都有"vc7","vc8","vc9".可怕的东西.

或者这个断言怎么样:

众所周知,C++在插件方面是不适应的.C++是特定于平台和特定于编译器的.C++标准没有指定应用程序二进制接口(ABI),这意味着来自不同编译器的C++库甚至同一编译器的不同版本是不兼容的.除此之外,C++没有动态加载的概念,每个平台都提供自己的解决方案(与其他平台不兼容),您就可以了解情况.

你对上述断言的看法是什么?像Java或.NET这样的问题会遇到这些问题吗?例如,如果我从Netbeans生成一个JAR文件,只要我确保它们都兼容JRE/JDK,它是否可以导入IntelliJ?

c++ code-reuse unmanaged

7
推荐指数
1
解决办法
974
查看次数

C++ std :: equal - 不测试具有相同大小的2个范围的基本原理?

我刚刚编写了一些代码来测试std :: equal的行为,并且惊讶地走了出来:

int main()
{
  try
  {
    std::list<int> lst1;
    std::list<int> lst2;

    if(!std::equal(lst1.begin(), lst1.end(), lst2.begin()))
      throw std::logic_error("Error: 2 empty lists should always be equal");

    lst2.push_back(5);

    if(std::equal(lst1.begin(), lst1.end(), lst2.begin()))
      throw std::logic_error("Error: comparing 2 lists where one is not empty should not be equal");
  }
  catch(std::exception& e)
  {
    std::cerr << e.what();
  }  
}
Run Code Online (Sandbox Code Playgroud)

输出(给我一个惊喜):

Error: comparing 2 lists where one is not empty should not be equal
Run Code Online (Sandbox Code Playgroud)

观察:为什么std :: equal首先检查2个容器是否相同size()?有合理的理由吗?

c++ stl

7
推荐指数
1
解决办法
3102
查看次数

每行^ M的文本文件

我刚从朋友那里得到了一个源代码文件.该文件是在UNIX中创建的.当我使用NotePad ++在Windows中打开它时,每行都有一个额外的空白行.

困惑,我下载了Vim并用它来打开文件.然后我在每一行的末尾看到了一堆^ M.

这是什么^ M?你怎么防止插入?

text-files

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