小编utn*_*tim的帖子

Visual C++ 2013,TFS和属性表的问题

背景

我目前正致力于Visual Studio 2013解决方案,包含约190个C++项目.由于它们都是同一生态系统的模块,因此它们具有许多共同的属性(常见的链接选项,二进制文件输出位置,后期构建步骤等).

因此,我们创建了一组属性表,使我们能够以集中的方式维护这些属性.

这很好用.

我们的团队使用TFS作为SCM,并且Visual Studio与TFS 的属性表集成似乎缺乏(或者可能只是错误或未配置).

问题

  1. 编辑属性表(存在于TFS中)时,Visual Studio会尝试保存它,但会失败并显示错误消息.再次单击"应用/确定",将正确地将PS中的更改存储在内存中,但在解决方案关闭之前不会保存属性表(执行签入时看不到更改导致开发人员进行两次更改提交,导致非事务性提交).

  2. 如果我在解决方案资源管理器中执行结帐,则永远不会签入属性表更改; 它们总是在TFS提交窗口的"排除的更改"中结束,并且当开发人员不关心这一点时会导致很多问题.

  3. 场景:开发人员A创建一个功能分支,添加一个带有属性表的项目,执行一些提交,然后合并回主分支,删除功能分支,每个人都获取代码.然后我们发现属性表从未在TFS中添加(Visual Studio在添加到项目时不会自行添加),并且由于开发人员A删除了她的本地分支文件,文件丢失; 这意味着失去了工作和再次写PS的努力.

问题

可以做些什么来自定义各种文件类型(如属性表)的TFS处理?

是否有任何Visual Studio或TFS工具可以改善/自动化这种集成?(我知道SO在工具推荐上并不大,但我更感兴趣的是找出功能是否存在,而不是获取特定的工具名称).

谢谢.

c++ tfs visual-studio-2013

16
推荐指数
1
解决办法
204
查看次数

将std :: move放入lambda真的有必要吗?

我真的必须在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++ c++11

9
推荐指数
1
解决办法
503
查看次数

realloc有什么问题?

开始在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)

c

5
推荐指数
1
解决办法
440
查看次数

Include Guard仍然插入全局变量

我在一个项目(Visual Studio)中有3个*.c文件(file1.c,file2.cfile3.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 global-variables include-guards

4
推荐指数
1
解决办法
533
查看次数

这段代码中切换/默认的奇怪目的是什么?

我正在将一些代码从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语句,代码应该有当案件被移除时,无论如何都被重构了.

感谢大家.

c c++ refactoring switch-statement

3
推荐指数
1
解决办法
1334
查看次数

C++"虚拟参数"

请考虑以下代码:

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++标准的伏都教)都表示赞赏.

c++ virtual-functions

3
推荐指数
1
解决办法
173
查看次数

如何限制构造对象寿命更长所需的变量范围?

我在堆栈上有一个对象需要另一个对象作为它的构造函数,如下所示:

{
    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,或者我应该接受它必须至少保持一定的范围?

c++ scope api-design raii

3
推荐指数
1
解决办法
350
查看次数

从lambda返回对象/ rvalue ref的首选形式

如果我有一个实现移动语义的类:

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)

c++ lambda rvalue c++11

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

如何将数组作为参数传递?

这真让我抓狂:

我有功能

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。

c++ arrays pointers

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

放开/追上堆栈安全吗?

问:在堆栈展开时引发并捕获异常是安全的,还是应用程序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在我的示例中)?

c++ exception-handling stack-unwinding

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

memset显示错误的结果

代码是检查在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)

c memset

0
推荐指数
1
解决办法
689
查看次数