小编Zac*_*ame的帖子

最好的一般SVN忽略模式?

使用一般SVN忽略模式的最佳(或尽可能好)是什么?

有许多不同的IDE,编辑器,编译器,插件,平台等特定文件和一些"重叠"的文件类型(即某些类型的项目而不是其他类型的项目).

但是,无论开发环境的具体情况如何,您都希望自动将大量文件类型自动包含在源代码管理中.

这个问题的答案可以作为任何项目的良好起点 - 只要求他们添加他们需要的少数环境特定项目.它也可以适用于其他版本控制系统(VCS).

language-agnostic svn environment version-control development-environment

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

C#中基于接口的编程的运算符重载

背景

我在当前项目中使用基于接口的编程,并在重载运算符(特别是Equality和Inequality运算符)时遇到问题.


假设

  • 我正在使用C#3.0,.NET 3.5和Visual Studio 2008

更新 - 以下假设是错误的!

  • 要求所有比较使用Equals而不是operator ==不是一个可行的解决方案,尤其是在将类型传递给库(例如Collections)时.

我担心要求使用Equals而不是operator ==的原因是我在.NET指南中找不到任何地方,它声称它会使用Equals而不是operator ==甚至建议它.但是,重新阅读覆盖等于和操作员指南==我发现了这个:

默认情况下,operator ==通过确定两个引用是否指示同一对象来测试引用相等性.因此,引用类型不必实现operator ==以获得此功能.当一个类型是不可变的,也就是说,实例中包含的数据不能改变时,重载operator ==来比较值的相等而不是引用相等可能是有用的,因为作为不可变对象,它们可以被认为是相同的因为它们具有相同的价值.在非不可变类型中覆盖operator ==不是一个好主意.

和这个Equatable接口

当在Contains,IndexOf,LastIndexOf和Remove等方法中测试相等性时,IEquatable接口由泛型集合对象(如Dictionary,List和LinkedList)使用.它应该针对可能存储在泛型集合中的任何对象实现.


约束上

  • 任何解决方案都不能要求将对象从其接口转换为其具体类型.

问题

  • 当operator ==的两边都是接口时,底层具体类型的operator == overload方法签名都不匹配,因此将调用默认的Object operator ==方法.
  • 在类上重载运算符时,二元运算符的至少一个参数必须是包含类型,否则会生成编译器错误(错误BC33021 http://msdn.microsoft.com/en-us/library/watt39ff .aspx)
  • 无法在接口上指定实现

请参阅下面的代码和输出,以说明问题.


在使用基于接口的编程时,如何为类提供适当的操作符重载?


参考

==运算符(C#参考)

对于预定义的值类型,如果操作数的值相等,则相等运算符(==)返回true,否则返回false.对于除string之外的引用类型,如果其两个操作数引用同一对象,则==返回true.对于字符串类型,==比较字符串的值.


也可以看看


using System;

namespace OperatorOverloadsWithInterfaces
{
    public interface IAddress : IEquatable<IAddress>
    {
        string StreetName { get; set; }
        string City { get; set; }
        string State { get; set; }
    }

    public …
Run Code Online (Sandbox Code Playgroud)

.net c# equals operator-overloading

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

如何在C中检查Windows上是否存在目录?

在Windows C应用程序中,我想验证传递给函数的参数,以确保指定的路径存在.*

如何在C中检查Windows上是否存在目录?

*我知道你可以进入竞争条件,在你检查存在的时间和使用它不再存在的路径的时间之间,但我可以处理.

附加背景

当权限发挥作用时,明确知道目录是否存在可能会变得棘手.在尝试确定目录是否存在时,该进程可能无权访问目录或父目录.这可以满足我的需求.如果目录不存在或者我无法访问它,则在我的应用程序中都将两者视为无效路径故障,因此我不需要区分.如果您的解决方案提供此区别,则(虚拟)奖励积分.

C语言,C运行时库或Win32 API中的任何解决方案都很好,但理想情况下我想坚持常用的库(例如kernel32,user32等)并避免涉及加载非标准库的解决方案(如Shlwapi.dll中的PathFileExists).如果您的解决方案是跨平台的,那么(虚拟)奖励积分.

有关

我们如何使用Win32程序检查文件是否存在?

c windows winapi

63
推荐指数
4
解决办法
6万
查看次数

使用/ Zi vs/Z7对Visual Studio C++项目有什么影响?

背景

您可以使用Visual Studio C++编译器使用几种不同的调试标志.他们是:

  • (没有)
    • 不创建调试信息
    • 编译时间更快
  • / Z7
    • 使用CodeView格式在.obj文件中生成完整的符号调试信息
  • /紫
    • 使用程序数据库格式在目标的.pdb文件中生成完整的符号调试信息.
    • 支持最小重建(/ Gm),这可以减少重新编译所需的时间.
  • / ZI
    • 除了支持Edit-and-Continue之外,生成像/ Zi这样的调试信息

问题

  • / Gm标志与多进程构建/ MP标志不兼容(Visual Studio 2005/2008)

  • 如果要启用最小重建,则/ Z7标志上需要/ Zi标志.

  • 如果你打算使用/ MP标志,/ Z7和/ Zi看起来在MSDN上似乎没有区别.但是,SCons文档声明必须使用/ Z7来支持并行构建.

问题

  • 在Visual Studio C++项目中使用/ Zi vs/Z7有什么含义?

  • 我错过了其中任何一种选择的其他优缺点吗?

  • 具体来说,目标的单个程序数据库格式(PDB)文件与每个源的多个CodeView格式(.obj)文件的好处是什么?

参考

MDSN/Z7,/ Zi,/ ZI(调试信息格式)

MSDN/MP(使用多个进程构建)

SCons构造变量CCPDBFLAG

调试信息

compiler-construction visual-studio-2005 visual-studio-2008 visual-studio visual-c++

36
推荐指数
3
解决办法
2万
查看次数

如何为独立类库程序集配置和启用log4net?

背景

我正在用C#.NET 3.5编写一个类库程序集,用于与其他应用程序集成,包括第三方商用现成(COTS)工具.因此,有时这个类库将由我控制的应用程序(EXE)调用,而有时它将被其他DLL或我无法控制的应用程序调用.

假设

  • 我使用的是C#3.0,.NET 3.5 SP1和Visual Studio 2008 SP1
  • 我使用的是log4net 1.2.10.0或更高版本

约束

任何解决方案必须

  • 如果调用应用程序未配置log4net,则允许类库通过其自己的配置文件启用和配置日志记录.
  • 允许类库通过调用应用程序配置启用和配置日志记录(如果它指定了log4net信息)

要么

  • 允许类库始终使用自己的配置文件启用和配置日志记录.

问题

当我的独立类库由我无法控制的DLL或应用程序(例如第三方COTS工具)调用且未指定log4net配置信息时,我的类库无法执行任何日志记录.


如何为独立类库程序集配置和启用log4net,以便无论调用应用程序是否提供log4net配置,它都将记录?

.net c# log4net

32
推荐指数
3
解决办法
3万
查看次数

Windows上的本机C++有哪些优秀的分析器?

我正在寻找一个用于本机C++的分析器.它当然不一定是免费的,但成本会影响购买决策.这是为了商业工作,所以我不能使用个人或学术许可副本.

我正在寻找的主要功能是:

  • 流程级别指标
  • 组件级指标
  • 行级指标
  • 支持多线程代码
  • 可用性
  • 成本
  • 需要Visual Studio 2005 Professional支持(非常需要VS 2008 Professional支持)

我使用过英特尔的VTune和Compuware的Devpartner性能分析社区版.

VTune似乎非常强大,但它有一个陡峭的学习曲线.它也非常"模块化",所以你必须弄清楚你需要购买哪些部件.

DevPartner PACE非常易于使用,并提供所有关键功能,但它只进行了45天的试用.许可版本(Visual C++ BoundsChecker Suite的DevPartner)大约1400美元一个座位,这是可行的,但有点高imo.

什么是原生C++的优秀剖析器和为什么


也可以看看:

什么是你最喜欢的C++分析工具

c++ windows performance profiling

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

如何使用nmake为C++项目组织项目树?

组织项目文件似乎有两个主要的约定,然后是许多变体.

惯例1:高级类型目录,项目子目录

例如,wxWidgets项目使用以下样式:

/solution
   /bin
      /prj1
      /prj2
   /include
      /prj1
      /prj2
   /lib
      /prj1
      /prj2
   /src
      /prj1
      /prj2
   /test
      /prj1
      /prj2
Run Code Online (Sandbox Code Playgroud)

优点:

  • 如果存在项目依赖项,则可以从单个文件管理它们
  • 平面构建文件结构

缺点:

  • 由于test有自己的头文件和cpp文件,因此当您为EXE文件而不是库生成单元测试应用程序时,它们需要包含您正在测试的应用程序中的目标文件.这需要您创建推理规则并扩展所有源文件的相对路径.
  • 重用另一个解决方案中的任何项目需要您从树结构中提取适当的文件并修改任何构建脚本

惯例2:高级项目目录,类型子目录

例如,Wireshark项目使用此样式

/solution
   /prj1
      /bin
      /include
      /lib
      /src
      /test
   /prj2
      /bin
      /include
      /lib
      /src
      /test
Run Code Online (Sandbox Code Playgroud)

优点:

  • 项目本身在其文件夹中是自包含的,使其更易于移动和重用
  • 允许在构建工具中使用更短的推理规则
  • 促进分层构建脚本

缺点:

  • 如果项目之间存在依赖关系,则需要在项目目录上方添加一层构建脚本来管理构建顺序

我们目前正在使用我们项目的惯例1,到目前为止它已经运作得相当好.现在,我正在添加单元测试(通过CxxTest)并使用nmake促进迁移到持续集成,约定1在创建正确的nmake文件时引起了一些严重的麻烦.

我的主要要求/目标是:

  • 降低维护整个解决方案的构建脚本的工作量.

  • 在其他项目的解决方案中分离项目及其构建步骤.

  • 通过使用构建脚本进行签出以便为每次提交释放媒体生成,从而促进持续集成(显然也利用其他工具,如CruiseControl).

  • 为开发人员添加或删除其他项目或源文件尽可能简单且最不容易出错.

所以我问:

  • 这两种方法都有其他优缺点吗?
  • 有没有一个明确的agrument只赞成这些约定之一?

build-automation nmake project-organization

17
推荐指数
1
解决办法
3442
查看次数

如何让项目将构建输出与Scons放在同一目录中?

背景

我正在通过设置一个包含两个子项目的基本C++示例项目来尝试Scons:

  • Prj1是依赖于Prj2的EXE
  • Prj2是一个导出一些函数的DLL

我遇到的问题是该库在与SConscript文件相同的目录中构建其.obj,.pdb,.lib,.dll等文件,而EXE在与SConscript相同的目录中构建其文件.应用程序成功构建了Prj2依赖项及其自身.但是,您无法运行生成的EXE,因为它无法找到所需的库,因为它位于其他目录中.

如何才能获得多个依赖于将二进制文件和调试信息输出到公共目录的项目,以便可以执行和调试它们?

潜在解决方案

这是我到目前为止所想到的:

  • 我尝试使用VariantDir(以前称为BuildDir),但这似乎不起作用.也许我在搞乱这里的东西.
  • 我可以明确地告诉编译器和链接器(例如通过Fo/Fd)放置文件的位置(这是最好还是唯一的解决方案???)
  • 在生成的二进制文件上执行复制命令(这看起来像是一个黑客,管理/维护非常痛苦)

更新

我更新了下面的文件结构和文件内容,以完整地反映其中的工作解决方案.感谢他的洞察力.

命令

使用此配置,您必须通过cd到构建目录然后运行以下命令来执行构建.我需要一个正常工作的别名设置来解决这个问题.


build> scons ../bin/project1.exe
Run Code Online (Sandbox Code Playgroud)

文件结构

    /scons-sample
       /bin
          /release
          /debug
       /build
           SConstruct
           scons_helper.py
       /prj1
           SConscript
           /include
           /src
              main.cpp
       /prj2
          SConscript
          /include
             functions.h
          /src
             functions.cpp        
Run Code Online (Sandbox Code Playgroud)

SConstruct


import os.path

BIN_DIR = '../bin'
OBJ_DIR = './obj'

#--------------------------------------
#            CxxTest Options
#--------------------------------------
CXXTEST_DIR = '../extern/CxxTest/CxxTest-latest'
PERL = 'perl -w'
TESTS = '*.h'
TESTGEN = PERL + CXXTEST_DIR + '/cxxtestgen.pl'
CXXTESTGEN_FLAGS = '--runner=ParenPrinter \
                    --abort-on-fail \
                    --have-eh'

#--------------------------------------
#            Options
#-------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

c++ build scons

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

Windows上的本机C++应用程序中的自动死代码检测?

背景

我有一个用本地C++编写的应用程序,在几年的时间里,大约有60个KLOC.有很多功能和类已经死了(可能有10-15%像下面提到的类似Unix的问题).我们最近开始对所有新代码进行单元测试,并尽可能将其应用于修改后的代码.但是,我会做一个SWAG,目前我们的测试覆盖率不到5%.

假设/约束

方法和/或工具必须支持:

  • 本机(即非托管)C++
  • Windows XP
  • Visual Studio 2005
  • 不得要求用户提供测试用例以进行覆盖.(例如,不能依靠单元测试来生成代码覆盖)

如果方法支持超过这些要求,那么很好.

注意:我们目前使用Visual Studio 2005的专业版,而不是Team System.因此,使用Team System可能是一个有效的建议(我不知道,我从未使用它)但是我希望它不是唯一的解决方案.

为什么使用单元测试代码覆盖是有问题的

我相信通用工具不可能在任何具有零误报的任意应用程序中找到所有死的(例如无法访问的代码)(我认为这相当于Halting问题).但是,我也相信通用工具有可能找到很多类型的死代码,这些代码实际上很可能已经死了,就像类或函数一样,它们在代码中永远不会引用任何其他东西.

通过使用单元测试来提供此覆盖,您不再使用通用算法,从而增加了可以检测到的死代码的百分比以及任何命中不是误报的概率.相反,使用单元测试可能会导致漏报,因为单元测试本身可能是执行给定代码段的唯一事情.理想情况下,我会进行回归测试,以执行所有外部可用的方法,API,用户控件等,这些将用作代码覆盖率分析的基线测量,以排除某些方法的误报.但遗憾的是,我目前没有这种自动化测试.

由于我拥有如此庞大的代码库,但测试用例覆盖率如此之低,我正在寻找一些可以帮助的东西,而不需要花费大量时间来编写测试用例.

您如何使用Visual Studio 2005开发环境在Windows平台上的本机C++应用程序中以自动或半自动方式检测死代码?

也可以看看

传统C/C++项目中的死代码检测 我想告诉VC++编译器编译所有代码.可以吗?

c++ windows code-coverage visual-studio-2005 dead-code

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

ADO EF - 错误映射TPH中派生类型之间的关联

背景

我正在使用.NET Framework 3.5 SP1在Visual Studio 2008 SP1中使用ADO实体框架编写数据访问库.我试图在两个实体之间创建关联,这两个实体都是从抽象类型派生的.我使用Table Per Hierarchy(TPH)表示两个实体继承层次结构,这意味着只有两个表 - 每个实体继承层次结构一个.

注意您可以使用每种类型的表(TPT)来避免此问题,但它带来了它自身的缺点.在继承持久性模型之间进行选择时,请参阅此处此处了解更多详细信息

以下是实体模型的Designer视图的屏幕截图:

 Visual Studio 2008 SP1中实体模型的设计视图

And here is a screenshot of the database schema:

数据库架构

Assumptions

When you create associations in the ADO Entity Framework Designer between derived types modeled with TPH using Visual Studio 2008 SP1 and the .NET Framework 3.5 SP1 you are likely to receive the following an "Error 3034: Two entities with different keys are mapped to the same …

c# orm entity-framework

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