我在Visual Studio 2008上开发了商业非托管C++应用程序,我想添加一个静态代码分析工具.
有什么建议?
如果该工具可以集成到MSVC中,我认为这将是非常好的.
我正在考虑PC-Lint + Visual Lint
但是,我一直在认真研究Coverity,Understanding和Klockwork.
价格不是真正的问题.我想要那些在MSVC上实际使用该工具进行非托管C++的人的意见,他们非常喜欢它.
最后,VSTS和Intel Parallel Studio现在还提供静态代码分析.尼斯〜
注意:相关帖子建议Coverity是最好的(?)(参见最后2篇帖子)
为什么这段代码不能编译?
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++中遇到这个问题.
创建可与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) 我认为QHostAddress是它,但奇怪的是它没有提供验证IP地址是否有效的方法(不再使用,已弃用到Qt3).
有人知道吗?
我目前正在进行性能分析.我们有一个基本的客户/服务器应用程序 如果我在同一台计算机(localhost)上运行客户端/服务器而不是在LAN上的两台计算机上运行TCP传输速度会不同?
对于这个片段,我并不感到惊讶全局变量'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)
所以我有这样的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)
有人可以说明如何做到这一点吗?
对于非托管C++,哪些内部代码共享更好?
无论它是什么:减少重复代码(复制粘贴综合症)的策略是什么,代码膨胀?
以下是我们在组织中共享代码的方式:
我们通过共享实际的源代码来重用代码.
我们使用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?
我刚刚编写了一些代码来测试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()?有合理的理由吗?
我刚从朋友那里得到了一个源代码文件.该文件是在UNIX中创建的.当我使用NotePad ++在Windows中打开它时,每行都有一个额外的空白行.
困惑,我下载了Vim并用它来打开文件.然后我在每一行的末尾看到了一堆^ M.
这是什么^ M?你怎么防止插入?
c++ ×3
qt ×2
code-reuse ×1
containers ×1
enums ×1
foreach ×1
java ×1
javascript ×1
stl ×1
text-files ×1
unmanaged ×1
visual-c++ ×1
xquery ×1