所以我们在我们的项目中有这个巨大的(11000行巨大的?)mainmodule.cpp源文件,每次我都要触摸它时我都会感到畏缩.
由于这个文件是如此中心和大,它不断累积越来越多的代码,我想不出一个让它真正开始缩小的好方法.
该文件在我们产品的几个(> 10)维护版本中使用并主动更改,因此很难重构它.如果我"简单地"把它分开,比如说开始,分成3个文件,那么合并来自维护版本的变化将成为一场噩梦.而且,如果你拆分了一个历史悠久且历史悠久的文件,跟踪和检查历史中的旧变化SCC突然变得更加困难.
该文件基本上包含我们程序的"主类"(主要内部工作调度和协调),因此每次添加一个功能时,它也会影响该文件,并且每次增长时都会影响该文件.:-(
在这个情况下,你会怎么做?有关如何将新功能移动到单独的源文件而不会弄乱SCC工作流程的任何想法?
(关于工具的注意事项:我们使用C++ Visual Studio;我们使用AccuRevas SCC但我认为这里的类型SCC并不重要;我们Araxis Merge用来做实际比较和合并文件)
应该使用哪个预处理器定义来指定代码的调试部分?
使用#ifdef _DEBUG或者#ifndef NDEBUG是否有更好的方法来做到这一点,例如#define MY_DEBUG?
我认为_DEBUG是Visual Studio特有的,是NDEBUG标准吗?
考虑这两种可以代表"可选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 ++ trunk和clang ++ 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)
为什么get_std_optional_int()需要三个mov指令,而get_my_optional()只需要一个 …
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下记录:
Run Code Online (Sandbox Code Playgroud)<ProjectReference> Represents a reference to another project. Item Name Description ------------------------- Name ... Project ... Package ... <Reference> Represents an assembly (managed) reference in …
.net msbuild copy-local visual-studio msbuild-projectreference
在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++
这个问题是由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编译器执行不同的操作.
快速链接:答案中的外部资源:
我已经看到这两个声明:
for(i=0;i<10;i++)
for(i=0;i!=10;i++)
Run Code Online (Sandbox Code Playgroud)
我知道当我到达时它们都会停止10,但使用第二个(我听说)似乎更好.有什么不同?我也想知道何时使用迭代器来访问向量的成员,迭代器条件< vec.end()和之间的区别是什么!= vec.end()
我在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) 如果我交换两个向量,它们的迭代器是否仍然有效,现在只是指向"其他"容器,或者迭代器是否会失效?
那是,给定:
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和C++预处理器宏的目的感兴趣NDEBUG.
该Ç以及C++标准只提及这个定义一次,即控制的行为assert()宏.
我会要求只包含特定的答案,您知道C或C++ 的某个平台/框架/库使用该NDEBUG定义来启用或禁用除标准定义的assert()宏之外的任何其他内容.
提出这个问题的一个原因是MS(Visual-C++)总是(?)使用"他们的" _DEBUG定义来区分调试和发布内容,我想知道这是否是图书馆/平台的常见做法"自己的"调试定义或其他库/平台是否NDEBUG用于调试相关的东西.
c++ ×7
c ×3
visual-c++ ×2
.net ×1
assembly ×1
c# ×1
c++11 ×1
c++17 ×1
c99 ×1
copy-local ×1
debugging ×1
dependencies ×1
for-loop ×1
iterator ×1
linker ×1
linq ×1
loops ×1
maintenance ×1
msbuild ×1
ndebug ×1
performance ×1
stl ×1
x86-64 ×1