在C++中将向量声明为全局是一种好习惯吗?
这就是我做的.
#include <vector>
std::vector<int> vec;
Run Code Online (Sandbox Code Playgroud)
我的程序编译成功,但我不确定这是否会在某些情况下导致运行时错误.根据我的理解,全局变量的内存将在编译时分配,编译器可以保留此向量可以扩展的有限数量的内存.达到此限制后,正在写入的内容可能会吞噬另一个变量使用的内存.
请指教.
我有这个扩展标记
public class NullableExtension : TypeExtension
{
public NullableExtension() {
}
public NullableExtension( string type )
: base(type) {
}
public NullableExtension( Type type )
: base(type) {
}
public override object ProvideValue( IServiceProvider serviceProvider ) {
Type basis = (Type)base.ProvideValue( serviceProvider );
return typeof(Nullable<>).MakeGenericType( basis );
}
}
Run Code Online (Sandbox Code Playgroud)
它旨在提供其他类型的可空版本.当在"普通"XAML中使用时,它按预期工作.例如,如
<SomeControl DataContext="{My:Nullable System:Int32}"/>
Run Code Online (Sandbox Code Playgroud)
(假设My是为保存扩展的C#名称空间定义的XML名称空间,对于System来说类似).控件的数据上下文设置为System.Typefor,Nullable<int>如我所料.
但是,当我使用此扩展来尝试设置类似的DataType属性时DataTemplate
<DataTemplate DataType="{My:Nullable System:Int32}">
<TextBlock ... />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
编译器告诉我的是
字典的键不能是'System.Windows.Controls.Primitives.TextBlock'类型.只支持String,TypeExtension和StaticExtension."
和
"类型'NullableExtension'的构造函数没有1个参数.
有人知道为什么只允许这三种方法(甚至不是TypeExtension像我的子类一样)?那时处理XAML有什么特别之处?是否有另一种方法来实现这一点(基于可以为空的类型的数据模板选择)而不诉诸DataTemplateSelector?
Perforce认为尝试提交没有文件的更改列表是一个错误(p4 submit ...返回退出代码1).这导致我们的构建服务器上的定期集成构建失败(我们正在使用Zutubi的Pulse系统); 在这种情况下,我宁愿让构建成功,可能会发出警告.
Pulse具有退出代码重映射功能,但Perforce似乎没有消除提交空更改列表失败和任何其他提交失败之间的歧义(这样的验证触发器失败,我确实希望构建失败).
我想到的最明显的(但在我看来,不优雅的)解决方案是将p4 submit批处理文件中的执行包装起来,首先通过计算输出行来检查目标更改列表是否为空p4 opened- 或者只是解析输出的p4 submit为"没有文件"的消息,并从批处理文件成功返回.
是否有更好的处理方法,我没有看到?
我有一个包含大量字符串的文件Guid="GUID HERE"(GUID HERE每次出现时都是唯一的GUID),我想用新的唯一GUID替换每个现有的GUID.
这是在Windows开发机器上,因此我可以生成唯一的GUID uuidgen.exe(每次运行时都会在stdout上生成GUID).我有sed这样的可用(但并不awk奇怪).
我基本上试图弄清楚是否有可能(如果是这样,如何)使用命令行程序的输出作为替换sed表达式中的替换文本,以便我可以在我的最小努力下进行替换部分.我不需要使用sed- 如果有另一种方法可以做到这一点,比如一些疯狂的vim-fu或其他一些程序,那也可行 - 但我更喜欢使用最小的*nix程序集的解决方案因为我不是真的在*nix机器上.
要清楚,如果我有这样的文件:
etc etc Guid="A" etc etc Guid="B"
Run Code Online (Sandbox Code Playgroud)
我希望它成为这样:
etc etc Guid="C" etc etc Guid="D"
Run Code Online (Sandbox Code Playgroud)
其中A,B,C,D是实际的GUID.
(例如,我已经看到xargs用于类似于此的东西,但它在我需要运行的机器上不可用.我可以安装它,如果它真的是唯一的方法,虽然我不想)
我有一个本地库的管理器包装器 - 本机库是带有导出C接口的C++,我在托管端使用P/Invoke来实现互操作.我控制托管代码和本机代码.
本机代码中有一个枚举,在托管代码中有相应的枚举,如下所示:
// C#
public enum ErrorCode {
None = 0,
General = 1,
BadThings = 2,
HardDriveWasRemoved = 3,
}
// C++
enum ERROR_CODE {
ERROR_CODE_NONE = 0,
ERROR_CODE_GENERAL = 1,
ERROR_CODE_BAD_THINGS = 2,
ERROR_CODE_HARD_DRIVE_REMOVED = 3,
}
Run Code Online (Sandbox Code Playgroud)
这些枚举需要保持同步,因为枚举值在托管代码和本机代码之间来回传递; 它们之间的不正确映射会导致细微的失败,并不总是很明显.
是否有人有任何聪明(但相对轻量级)的技术(a)自动保持这些枚举同步,或(b)尽可能早地提供警告/错误/失败的枚举不同步?
我使用过Directory.getCurrentDirectory();
它只给出C:\ Windows\SysWOW64
但我需要获得visual studio默认项目文件夹,我怎么能得到它?
例如:C:\ Users\knallasi\Documents\Visual Studio 2010\Projects\SampleApp
我们如何找到上面的项目位置?
提前致谢