小编Mar*_* Ba的帖子

如何为聚合结构实现C++(in)相等运算符?

有时候我有这样的结构 -

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,作为比较(<,<=,...)并没有什么太大的意义了这样的聚集.

c++ equality operator-overloading operators

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

CloseWindow和WM_CLOSE的关系是什么

我目前有点困惑:WM_CLOSE是否与::CloseWindow任何"相关"或完全不同的东西?

Closing Windows的文档根本没有提到API函数CloseWindow.应该CloseWindow真的叫做"MinimizeWindow"还是我错过了什么?

windows winapi mfc window-messages

10
推荐指数
2
解决办法
1256
查看次数

如何在没有获得WER对话框的情况下在Windows-7上崩溃进程?

是否可以在Windows-7上崩溃常规用户模式进程而无需获取Windows错误报告(WER)对话框?(当WER正常启用且未应用特定标志时.)

注意:我对禁用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

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

reinterpret_cast与static_cast在标准布局类型中写入字节?

我需要写一些整数类型的单个字节.我应该使用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++ reinterpret-cast visual-c++-2005 standard-layout c++11

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

存在哪些C++字符串类/系统具有良好的unicode支持和良好的接口?

在C++开发中使用字符串总是比Java或脚本语言等语言更复杂.我认为一些复杂性来自于C++中的性能焦点,有些只是历史性的.

我知道以下主要的字符串系统,并想知道是否有其他字符串以及它们相互之间有什么特别的缺点:

我承认没有明确的答案,但我认为SOs投票系统非常适合显示实际使用某个字符串系统的人的偏好(以及论证的有效性).


从答案中添加:

  • UFT8-CPP:http://utfcpp.sourceforge.net/

c++

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

在C++流中禁用指针输出?

如果您将任何指针传递给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命名空间中定义的运算符

c++ iostream

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

VS11中对Windows XP的支持是否与先前的Visual Studio版本相当?

编辑说明:在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支持.

windows history visual-studio visual-c++ visual-studio-2012

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

构建使用Visual Studio 2012创建的C++/C#而不安装VS 2012?

如果我有VS2012的Visual Studio解决方案文件,其中包含很少的C++本机项目和一些C#项目,我是否可以在不安装 Visual Studio 2012本身的情况下构建此解决方案?

这将简化(除其他外)我们的Build-Server节点上的维护.

msbuild winapi visual-studio visual-c++ visual-c++-2012

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

使用来自不同时间/团队编译的同一VS的C++ DLL - ABI兼容性?

重复:我正在寻找相同 Visual-C++版本的库之间的ABI兼容性!

我们希望混合和匹配来自不同团队的一些内部C++ DLL - 在不同时间使用不同的项目文件构建.由于构建时间较长,我们确实希望避免大型单片构建,其中每个团队重新编译另一个团队库的源代码.

当消耗C++的DLL 和C++的接口相当 清楚 的是,你只能这样做,如果所有的DLL与相同的编译器/ Visual Studio的版本编译.

什么对我来说并不很明显是什么,到底需要是相同的,以获得ABI的兼容性.

  • 显然, debug(_DEBUG)和release(NDEBUG)不能混合 - 但是这些链接到不同版本的共享运行时这一事实也很明显.
  • 您是否需要完全相同的编译器版本,或者生成的DLL链接到同一共享 C++运行时是否足够- 也就是说,基本上是相同的可再发行组件?(我认为当传递完整的C++对象时静态不会飞)
  • 是否存在编译器(和链接器)选项的文档列表,这些选项需要相同才能兼容相同vc ++版本的两个C++ DLL?
    • 例如,是否/O需要相同的开关 - 优化级别是否会影响ABI兼容性?(我很确定不会.)
    • 或者两个版本都必须使用相同的/EH开关
    • 还是/volatile:ms|iso......?

本质上,我想提出一组(元)数据来与描述它的ABI兼容性的Visual-C++ DLL相关联.

如果存在差异,我现在只关注VS2015.

abi visual-c++ visual-studio-2015 visual-c++-2015

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

有什么方法可以将google protobuf消息转换为带有缩进的json?

我需要使用 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 的最佳方法是什么?

c# indentation protocol-buffers

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