有时候我有这样的结构 -
struct aggregate1 {
std::string name;
std::vector<ValueT> options;
size_t foobar;
// ...
};
Run Code Online (Sandbox Code Playgroud)
- 其中(in)等式简单地定义为(in)所有成员的相等:lhs_name == rhs_name && lhs_options == rhs_options && lhs_foobar == rhs_foobar.
实现这一目标的"最佳"方式是什么?(最佳:(运行时)效率,可维护性,可读性)
operator== 就......而言 operator!=operator!= 就......而言 operator====和!=请注意,这个问题只是关于(不)平等OPS,作为比较(<,<=,...)并没有什么太大的意义了这样的聚集.
我目前有点困惑:WM_CLOSE是否与::CloseWindow任何"相关"或完全不同的东西?
Closing Windows的文档根本没有提到API函数CloseWindow.应该CloseWindow真的叫做"MinimizeWindow"还是我错过了什么?
注意:我对禁用WER 不感兴趣,我对WER未启动的崩溃场景感兴趣,尽管它应该和Windows"默默地"终止应用程序.
在Windows XP上,编写一个C或C++应用程序(在用户模式下)是非常简单的,它会以这样的方式混淆自己的地址空间,当最终引发访问冲突(或其他未处理的Win32异常)时,Windows XP将会只是默默地终止进程而不通知用户:
...
void stackbreaker() {
printf("%s\n", __FUNCTION__);
// global/static buffer
static char buf[128] = "In a hole in the ground there lived a hobbit. And it burrowed through your stack. It even built a round door into you function.";
// Get address on the stack
char local;
char* stack = &local;
// nuke the stack:
memcpy(stack - 64, buf, sizeof(buf));
// Kaboom. No user defined unhandled exception filter will …Run Code Online (Sandbox Code Playgroud) winapi unhandled-exception visual-c++ windows-7 windows-error-reporting
我需要写一些整数类型的单个字节.我应该使用reinterpret_cast,还是应该使用static_castvia void*?
(一个)
unsigned short v16;
char* p = static_cast<char*>(static_cast<void*>(&v16));
p[1] = ... some char value
p[0] = ... some char value
Run Code Online (Sandbox Code Playgroud)
或(b)
unsigned short v16;
char* p = reinterpret_cast<char*>(&v16);
p[1] = ... some char value
p[0] = ... some char value
Run Code Online (Sandbox Code Playgroud)
根据static_cast和reinterpret_cast对std :: aligned_storage的回答都应该是等价的 -
- 如果T1和T2都是标准布局类型,并且T2的对齐要求不比T1更严格
我倾向于reinterpret_cast为是基本上我在做什么,不是吗?
还有其他需要考虑的事情,特别是我们正在编译的Visual-C++和VC8版本吗?(x86只有atm.)
在C++开发中使用字符串总是比Java或脚本语言等语言更复杂.我认为一些复杂性来自于C++中的性能焦点,有些只是历史性的.
我知道以下主要的字符串系统,并想知道是否有其他字符串以及它们相互之间有什么特别的缺点:
我承认没有明确的答案,但我认为SOs投票系统非常适合显示实际使用某个字符串系统的人的偏好(以及论证的有效性).
从答案中添加:
如果您将任何指针传递给C++流,它的地址将被放入输出中.(显然除非有更具体的输出处理程序.)
void* px = NULL;
const char* ps = "Test";
FooType* pf = ...;
stringstream s;
s << ps << " " << px << " " << pf "\n";
s.str(); // yields, for example: "Test 0 AF120089"
Run Code Online (Sandbox Code Playgroud)
如果用户错误地尝试实际打印FooType 的值,则这可能是个问题.
当混合使用宽字符和窄字符时,它也是一个问题,因为您将获得打印的地址而不是编译器错误:
const wchar_t* str = L"Test! (Wide)";
// ...
cout << str << "\n"; // Ooops! Prints address of str.
Run Code Online (Sandbox Code Playgroud)
所以我想知道 - 因为我很少想输出指针值,是否可以禁用指针值的格式化,以便将指针值插入流中会导致编译器错误?(然后可以通过使用包装器类型或将指针值强制转换为size_t或某些东西来轻松实现指针值的输出.)
编辑:根据Neil的答案(通过提供我自己的void*输出操作符来禁用void*输出)我想补充一点,如果这对于Boost.Format这样的工具也有用,那会隐式使用输出在std命名空间中定义的运算符
编辑说明:在MS从他们的客户那里获得了关于drop-XP-stunt的大量不良反馈后,他们宣布将发布一个允许为XP构建可执行文件的补丁.所以这个Q的基础确实不存在,但我认为它收集了一些非常有趣的信息.
如下所示:使用Visual Studio 11编译的可执行文件有什么特别之处,导致可执行文件无法在Windows XP上执行?
在此Connect错误/问题:https://connect.microsoft.com/VisualStudio/feedback/details/690617,Visual Studio 11(计划发布2012)计划不再支持Windows XP.
这意味着您无法创建可在Windows XP上执行的本机C++可执行文件.(一个原因是新的CRT将使用仅在Windows Vista及更高版本上可用的Windows API调用.)
在一个答案中,安德斯写道:
他们似乎在VS(NT4,2000,XP)的每个新版本中都不再支持旧系统......
我现在感兴趣的是,微软是否完全从VS11 C++中删除Windows XP支持,这实际上可以与之前的版本进行比较.
我的意思是,什么时候支持哪个操作系统(NT3.5/NT4/2000sp6 // Win95/Win98/...)完全从Visual C++中删除.(以及Visual C++的"哪个部分" - 编译器,CRT,Windows SDK?)
例如,我想我知道VC6是VS的最后一个版本,可用于创建在Windows NT4上运行的可执行文件.我似乎还记得,对Win2k的支持下降与你使用的Windows SDK有关,而不是与实际的编译器或CRT有关,但我不确定.
是否有一个很好的资源可以显示哪个MS编译器在哪个设置中可以生成哪些OS版本的兼容代码?VS11(2012年)的时机是否不再支持与之前版本相比广泛安装(但不再销售)的操作系统?
有一点感兴趣的是,我们处于从C++ 03到C++ 11的转变中,如果你坚持使用Windows XP和VC10,你就会陷入限制(部分非-standard)它提供的C++ 11支持.
如果我有VS2012的Visual Studio解决方案文件,其中包含很少的C++本机项目和一些C#项目,我是否可以在不安装 Visual Studio 2012本身的情况下构建此解决方案?
这将简化(除其他外)我们的Build-Server节点上的维护.
重复:我正在寻找相同 Visual-C++版本的库之间的ABI兼容性!
我们希望混合和匹配来自不同团队的一些内部C++ DLL - 在不同时间使用不同的项目文件构建.由于构建时间较长,我们确实希望避免大型单片构建,其中每个团队重新编译另一个团队库的源代码.
当消耗C++的DLL 和C++的接口是相当 清楚 的是,你只能这样做,如果所有的DLL与相同的编译器/ Visual Studio的版本编译.
什么对我来说并不很明显是什么,到底需要是相同的,以获得ABI的兼容性.
_DEBUG)和release(NDEBUG)不能混合 - 但是这些链接到不同版本的共享运行时这一事实也很明显./O需要相同的开关 - 优化级别是否会影响ABI兼容性?(我很确定不会.)/EH开关?/volatile:ms|iso......?本质上,我想提出一组(元)数据来与描述它的ABI兼容性的Visual-C++ DLL相关联.
如果存在差异,我现在只关注VS2015.
我需要使用 C#将Google protobuf IMessage 对象保存到 json 文件中。这是示例代码:
using (var input = File.OpenRead(protodatFile))
{
string jsonString = null;
message.MergeFrom(input); //read message from protodat file
JsonFormatter formater = new JsonFormatter(
new JsonFormatter.Settings(false));
jsonString = formatter.Format(message);
System.IO.File.WriteAllText(jsonFile, jsonString);
}
Run Code Online (Sandbox Code Playgroud)
这使用JsonFormatter来自 Google Protobuf 库的。
问题:所有 json 内容都存储在一行中。当文件很大(> 50 MB)时,很难在文本编辑器中打开/查看。
在这里制作缩进 jsonFile 的最佳方法是什么?