小编Mar*_* Ba的帖子

如何处理11000行C++源文件?

所以我们在我们的项目中有这个巨大的(11000行巨大的?)mainmodule.cpp源文件,每次我都要触摸它时我都会感到畏缩.

由于这个文件是如此中心和大,它不断累积越来越多的代码,我想不出一个让它真正开始缩小的好方法.

该文件在我们产品的几个(> 10)维护版本中使用并主动更改,因此很难重构它.如果我"简单地"把它分开,比如说开始,分成3个文件,那么合并来自维护版本的变化将成为一场噩梦.而且,如果你拆分了一个历史悠久且历史悠久的文件,跟踪和检查历史中的旧变化SCC突然变得更加困难.

该文件基本上包含我们程序的"主类"(主要内部工作调度和协调),因此每次添加一个功能时,它也会影响该文件,并且每次增长时都会影响该文件.:-(

在这个情况下,你会怎么做?有关如何将新功能移动到单独的源文件而不会弄乱SCC工作流程的任何想法?

(关于工具的注意事项:我们使用C++ Visual Studio;我们使用AccuRevas SCC但我认为这里的类型SCC并不重要;我们Araxis Merge用来做实际比较和合并文件)

c++ version-control maintenance anti-patterns

228
推荐指数
13
解决办法
2万
查看次数

_DEBUG与NDEBUG

应该使用哪个预处理器定义来指定代码的调试部分?

使用#ifdef _DEBUG或者#ifndef NDEBUG是否有更好的方法来做到这一点,例如#define MY_DEBUG

我认为_DEBUG是Visual Studio特有的,是NDEBUG标准吗?

c c++ debugging

132
推荐指数
6
解决办法
13万
查看次数

为什么std :: optional <int>的构造比std :: pair <int,bool>更昂贵?

考虑这两种可以代表"可选int"的方法:

using std_optional_int = std::optional<int>;
using my_optional_int = std::pair<int, bool>;
Run Code Online (Sandbox Code Playgroud)

鉴于这两个功能......

auto get_std_optional_int() -> std_optional_int 
{
    return {42};
}

auto get_my_optional() -> my_optional_int 
{
    return {42, true};
}
Run Code Online (Sandbox Code Playgroud)

... g ++ trunkclang ++ trunk (with -std=c++17 -Ofast -fno-exceptions -fno-rtti)产生以下程序集:

get_std_optional_int():
        mov     rax, rdi
        mov     DWORD PTR [rdi], 42
        mov     BYTE PTR [rdi+4], 1
        ret

get_my_optional():
        movabs  rax, 4294967338 // == 0x 0000 0001 0000 002a
        ret
Run Code Online (Sandbox Code Playgroud)

godbolt.org上的实例


为什么get_std_optional_int()需要三个mov指令,而get_my_optional()只需要一个 …

c++ performance assembly x86-64 c++17

65
推荐指数
3
解决办法
3365
查看次数

MSBuild ProjectReference:private("Copy Local") - 允许的值和行为是什么?

TL; DR是否有任何官方文档详细描述<private>/"复制本地"选项如何与MSBuild一起使用?应该考虑什么价值?


当你添加一个项目引用从一个项目在Visual Studio中的另一个,它会加入<ProjectReference Include=".....csproj">.csproj的MSBuild文件.

当您 Visual Studio中的一个项目文件引用添加到文件系统中的程序集文件时,它将添加<Reference Include="Foo"> <HintPath>....Foo.dll</HintPath> ....csprojMSBuild文件.

这两种情况下,Visual Studio的设置Copy Local = True|False,一个子元素<Private>True</Private><Private>False</Private>将增加.

Reference并且ProjectReference似乎在Common MSBuild Project Items下记录:

<ProjectReference>
  Represents a reference to another project.

  Item Name    Description
  -------------------------
   Name         ...
   Project      ...
   Package      ...

<Reference>
  Represents an assembly (managed) reference in …
Run Code Online (Sandbox Code Playgroud)

.net msbuild copy-local visual-studio msbuild-projectreference

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

"链接库依赖关系"链接器选项在Visual Studio 2010 - 2015及更高版本中实际执行的操作是什么?

在VS2008之前,您可以在解决方案文件()中设置原生C++项目依赖项Project Dependencies ...,如果(默认情况下)设置链接器选项

Properties -> Linker -> General : Link Library Dependencies = Yes
Run Code Online (Sandbox Code Playgroud)

如果设置,Visual Studio Build将自动链接.lib到该项目所依赖的所有项目(DLL,LIB)的文件中将"静态"链接.


:微软改变了依赖关系是如何工作的 VS2010,现在你应该直接添加依赖到项目

Common Properties -> Framework and References : (List of depenencies) 

    (each lib/dll has a separate option: 
     Project Reference Properties -> Link Library Dependencies : True|False
Run Code Online (Sandbox Code Playgroud)

我很好.不是这个问题的内容.

(这里有一个解释:灵活的项目到项目参考.)


仍然可能然而定义的解决方案级项目的依赖性和General链接器选项也仍然存在.但它不起作用.看到:

特别是在这里看到(随后的问题)

linker dependencies projects-and-solutions visual-studio-2010 visual-c++

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

C(99)和C++(11)之间有什么不兼容的区别?

这个问题是由Herb Sutter的一篇文章的回复引发的,他在那里解释了MS决定不支持/制作C99编译器,但只是采用了C++(11)标准中的C(99)功能.

一位评论者回答说:

(...)C很重要,值得至少注意一点.

有很多现有的代码是有效的C但不是有效的C++.该代码不太可能被重写(...)

因为我只使用MS C++编程,所以我真的不知道"纯粹的"C,即我没有准备好了解C++的细节 - 我正在使用的语言不在C(99)中,而且我几乎没有一些C99代码在C++编译器中无法正常工作的线索.

请注意,我知道只有C99的restrict关键字对我来说似乎有非常狭窄的应用程序和关于可变长度数组(我不确定它们有多广泛或重要).

此外,我很感兴趣是否存在任何重要的语义差异或陷阱,即C(99)代码将在C++(11)下编译,但使用C++编译器而不是C编译器执行不同的操作.


快速链接:答案中的外部资源:

c c++ c99 c++11

54
推荐指数
2
解决办法
8748
查看次数

在"for"语句中,我应该使用`!=`还是`<`?

我已经看到这两个声明:

for(i=0;i<10;i++) 

for(i=0;i!=10;i++)
Run Code Online (Sandbox Code Playgroud)

我知道当我到达时它们都会停止10,但使用第二个(我听说)似乎更好.有什么不同?我也想知道何时使用迭代器来访问向量的成员,迭代器条件< vec.end()和之间的区别是什么!= vec.end()

c++ loops for-loop conditional-statements

53
推荐指数
6
解决办法
1896
查看次数

C#Linq Where(表达式).FirstorDefault()vs .FirstOrDefault(expression)

我在Linq非常新,并且在使用什么来表现性能方面处于两难境地

var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault();
// vs.
var result = ResultLists().FirstOrDefault( c => c.code == "abc");
Run Code Online (Sandbox Code Playgroud)

c# linq

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

std :: vector :: swap会使迭代器失效吗?

如果我交换两个向量,它们的迭代器是否仍然有效,现在只是指向"其他"容器,或者迭代器是否会失效?

那是,给定:

using namespace std;
vector<int> x(42, 42);
vector<int> y;
vector<int>::iterator a = x.begin(); 
vector<int>::iterator b = x.end();

x.swap(y);

// a and b still valid? Pointing to x or y?
Run Code Online (Sandbox Code Playgroud)

似乎std没有提到这个:

[n3092 - 23.3.6.2]

void swap(vector<T,Allocator>& x);

效果:将*的内容和容量()与x的内容和容量()进行交换.

请注意,因为我在VS 2005上,我也对迭代器调试检查等的影响感兴趣(_SECURE_SCL)

c++ iterator stl visual-c++

39
推荐指数
2
解决办法
4079
查看次数

用于(在不同平台上)的NDEBUG预处理器宏是什么?

我对各种平台/编译器("实现")/框架分配给C和C++预处理器宏的目的感兴趣NDEBUG.

Ç以及C++标准只提及这个定义一次,即控制的行为assert()宏.

我会要求只包含特定的答案,您知道C或C++ 的某个平台/框架/库使用该NDEBUG定义来启用或禁用除标准定义的assert()宏之外的任何其他内容.

提出这个问题的一个原因是MS(Visual-C++)总是(?)使用"他们的" _DEBUG定义来区分调试和发布内容,我想知道这是否是图书馆/平台的常见做法"自己的"调试定义或其他库/平台是否NDEBUG用于调试相关的东西.

c c++ cross-platform ndebug c-preprocessor

37
推荐指数
2
解决办法
4万
查看次数