我目前正致力于Visual Studio 2013解决方案,包含约190个C++项目.由于它们都是同一生态系统的模块,因此它们具有许多共同的属性(常见的链接选项,二进制文件输出位置,后期构建步骤等).
因此,我们创建了一组属性表,使我们能够以集中的方式维护这些属性.
这很好用.
我们的团队使用TFS作为SCM,并且Visual Studio与TFS 的属性表集成似乎缺乏(或者可能只是错误或未配置).
编辑属性表(存在于TFS中)时,Visual Studio会尝试保存它,但会失败并显示错误消息.再次单击"应用/确定",将正确地将PS中的更改存储在内存中,但在解决方案关闭之前不会保存属性表(执行签入时看不到更改导致开发人员进行两次更改提交,导致非事务性提交).
如果我在解决方案资源管理器中执行结帐,则永远不会签入属性表更改; 它们总是在TFS提交窗口的"排除的更改"中结束,并且当开发人员不关心这一点时会导致很多问题.
场景:开发人员A创建一个功能分支,添加一个带有属性表的项目,执行一些提交,然后合并回主分支,删除功能分支,每个人都获取代码.然后我们发现属性表从未在TFS中添加(Visual Studio在添加到项目时不会自行添加),并且由于开发人员A删除了她的本地分支文件,文件丢失; 这意味着失去了工作和再次写PS的努力.
可以做些什么来自定义各种文件类型(如属性表)的TFS处理?
是否有任何Visual Studio或TFS工具可以改善/自动化这种集成?(我知道SO在工具推荐上并不大,但我更感兴趣的是找出功能是否存在,而不是获取特定的工具名称).
谢谢.
我真的必须在lambda中封装std :: move调用吗?
std::list<std::wstring> srcData = GetData(); // implementation not important
std::vector<std::wstring> dstData;
dstData.reserve(srcData.size());
std::transform(std::begin(srcData), std::end(srcData), std::back_inserter(dstData),
[](std::wstring& guid) -> std::wstring { return std::move(guid); });
srcData.clear();
Run Code Online (Sandbox Code Playgroud)
我还是lambdas和rvalue引用的新手,所以最初我尝试过:
std::transform(std::begin(srcData), std::end(srcData),
std::back_inserter(dstData), &std::move<std::wstring>);
Run Code Online (Sandbox Code Playgroud)
这不起作用.
我是否必须将移动放在一个lambda中,或者我错过了一些明显的东西?
开始在C学习malloc.h.想法是创建动态数组.这是代码:
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
int main() {
int *array = (int*)malloc(sizeof(int));
int i, j, val;
for (i = 0;; i++) {
array = (int*)realloc(array, sizeof(int) + sizeof(*array));
printf("Enter array[%d]=", i);
scanf("%d", (array + i));
if (*(array + i) == 0) break;
}
for (j = 0; j < i; j++) {
printf("[%d] = %d\n", j, *(array + j));
}
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是
Enter array[0]=1
Enter array[1]=2
Enter array[2]=3
Enter array[3]=4
Enter array[4]=5
Enter array[5]=6
Enter …Run Code Online (Sandbox Code Playgroud) 我在一个项目(Visual Studio)中有3个*.c文件(file1.c,file2.c和file3.c)和1个*.h文件(file3.h).
/*******************************
file3.h
********************************/
#ifndef FILE3_H
#define FILE3_H
int gintVariable = 400;
#endif
Run Code Online (Sandbox Code Playgroud)
/*******************************
file1.c
********************************/
#include "file3.h"
#include <stdio.h>
#include <conio.h>
int modifyGlobalVariable(void);
void printGlobalVariable(void);
int main(void)
{
modifyGlobalVariable();
printGlobalVariable();
printf("Global variable: %d\n", gintVariable++);
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
/*******************************
file2.c
********************************/
#include "file3.h"
int modifyGlobalVariable(void)
{
return gintVariable++;
}
Run Code Online (Sandbox Code Playgroud)
/*******************************
file3.c
********************************/
#include "file3.h"
#include <stdio.h>
void printGlobalVariable(void)
{
printf("Global: %d\n", gintVariable++);
}
Run Code Online (Sandbox Code Playgroud)
当我在VS中构建解决方案时,它会给出错误"_gintVariable already …
我正在将一些代码从C转移到C++,我找到了这段代码:
if(ErrorCode >= SOME_CONSTANT)
{
Status = RETVAL_OK;
switch ( ErrorCode )
{
default:
Status = RETVAL_FAILED;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
此代码生成编译警告:
warning C4065: switch statement contains 'default' but no 'case' labels
Run Code Online (Sandbox Code Playgroud)
问题:switch语句是否有任何目的(我没有掌握)或者只是简单的代码?
也就是说,有没有任何理由(编译ANSI C或C++时)不这样写?
if(ErrorCode >= SOME_CONSTANT)
Status = RETVAL_FAILED;
Run Code Online (Sandbox Code Playgroud)
编辑:解决出现的所有问题:
代码并不是要扩展:这是四年前交付的模块的最终版本(从那以后它没有被触及,所以我倾向于相信它是残酷的).
据我所见,还没有删除的case语句(相同的代码构造放在代码中的三个不同的位置(switch/default如果检查错误常量,则相同)如果有删除的case语句,代码应该有当案件被移除时,无论如何都被重构了.
感谢大家.
请考虑以下代码:
class A {
public:
virtual ~A() {}
};
class AA : public A {
};
////////////////////////////////////////
class B {
public:
virtual void f(const A &a) {
// code for A
}
};
class BB : public B {
public:
virtual void f(const AA &a) {
// code for AA
}
};
////////////////////////////////////////
int main() {
A *a = new AA;
B *b = new BB;
b->f(*a);
}
Run Code Online (Sandbox Code Playgroud)
显然,构造vtable使得当执行上述操作时// code for A.我正在寻找一种能够执行的方法// code for AA.
动机是这是一个代码库,最终用户通常必须编写BB形式的类,我希望这个过程尽可能简单(即用户不必使用RTTI找出他们正在处理的A派生类).任何想法(以及来自任何版本的C++标准的伏都教)都表示赞赏.
我在堆栈上有一个对象需要另一个对象作为它的构造函数,如下所示:
{
ObjectDef def(importantData); // should die as soon as obj is created
def.setOptionalData(100);
Object obj(def); // should live for the remainder of the function body
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我喜欢将变量def放在自己的范围内.这给了我"def"的名字,并且清楚地表明它不再有用了.
例如,result我想做的事情是obj:
// scope block
{
int result = complexFunction() + anotherFunction();
printf("the result is %i", result);
doMoreThingsWithIt(result);
}
// "result" is now gone
Run Code Online (Sandbox Code Playgroud)
但问题是,我无法在这里做到这一点,我可以看到.构造函数Object obj不能在范围之前,因为它是构造函数需要的def,并且它不能在范围内,因为obj需要存活的时间比def.
无论如何要将限制def的范围缩短obj,或者我应该接受它必须至少保持一定的范围?
如果我有一个实现移动语义的类:
class BigObject
{
public:
BigObject(something x = something()) { ... }
BigObject(const BigObject& other) { ... }
BigObject(BigObject&& other) { ... }
BigObject& operator=(BigObject other) { ... }
void swap(BigObject& other) { ... }
// [...]
};
auto begin = std::begin(somethingSequence); // collection doesn't matter here
auto end = std::end(somethingSequence); // collection doesn't matter here
BigObjectOutputIterator dest; // collection doesn't matter here
Run Code Online (Sandbox Code Playgroud)
在lambda中返回BigObject的正确方法是什么?
std::transform(begin, end, dest,
[](something x) -> BigObject {return BigObject(x); });
Run Code Online (Sandbox Code Playgroud)
要么
std::transform(begin, end, dest,
[](something x) …Run Code Online (Sandbox Code Playgroud) 这真让我抓狂:
我有功能
void gst_init(int *argc, char **argv[]);
Run Code Online (Sandbox Code Playgroud)
在 gstreamer api 中,我想使用我定义的一些参数来调用它,例如:
int argc = 2;
char* argv[2] = {"myvalue1", "myvalue2"};
gst_init(&argc, &argv);
Run Code Online (Sandbox Code Playgroud)
此代码无法编译(我收到错误 C2664):
error C2664: 'gst_init' : cannot convert parameter 2 from 'char *(*)[2]' to 'char **[]'
Run Code Online (Sandbox Code Playgroud)
问题:如何定义argv将其作为参数传递的值?我使用 C++ 已有 5 年多了,但自从……我想是高中(五年多前)以来,我就没有使用过原始数组。
编辑:我正在使用 VS2010 Express。
问:在堆栈展开时引发并捕获异常是安全的,还是应用程序terminate在第二次引发时调用?
最小的例子:
void some_function()
{
try
{
// do stuff here that can throw
throw std::runtime_error("blah");
} catch(const std::exception& re)
{
try // this code could be in some function called from here
{
// do something with re here that throws a logical_error
throw std::logical_error("blah blah"); // does this call terminate?
} catch(const std::logical_error& le)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
看完这个问题我很好奇。
注意:我知道您可以/应该catch(...)在析构函数中使用,但是通常try/catch在一个catch块中包含有意义-也许在调用异常的某些函数中(re在我的示例中)?
代码是检查在memset中的memset的工作.memset正确初始化数组0但是当我尝试用10初始化它时,它会用一些非常大的垃圾值初始化数组.那有什么问题?
#include <stdio.h>
#include<string.h>
int main(void)
{
int dp[10008],i;
memset(dp,10,sizeof(dp));
for(i=0;i<10;i++)
printf("%d\n",dp[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)