注意:
Boost的归档方案基于对称的输入和输出归档类.一直写下这两个都很乏味,所以我会用它?archive来表示oarchive和iarchive.
总结:
从改变我的自定义档案的基类后binary_?archive_impl到text_?archive_impl,我自定义的存档类不再是"发现"当编译器实例化serialize(...)我在其他类中的方法.
背景:
我的应用程序成功地使用子类binary_?archive_impl(文档和/或代码注释推荐此文件来源)读取和写入文件到磁盘binary_?archive.我需要从二进制文件格式切换到文本格式,因此我将自定义归档的基类切换为text_?archive_impl.一切都爆发了.
问题:
我的自定义归档类添加了功能,包括其Boost基类中不存在的一些其他方法; 这些方法在serialize(...)我的许多类中的方法中调用,并且它们工作正常.更改基类后binary_?archive_impl到text_?archive_impl,我收到遍布说我的自定义方法的地方编译错误不存在在text_?archive.嗯,这很明显(!!!),但它们确实存在于我的自定义存档中,当我使用Boost的二进制基类时,它们工作得很好.这是怎么回事?
我发现了什么,以及我暂时的 - 但不可取的 - 解决方案:
撕掉我的头发并绕圈走了大约一天后,这就是我发现的......
1)前一段时间(我相信Boost 1.34),文件"binary_?archive.hpp"被分成"binary_?archive_impl.hpp"和"binary_?archive.hpp"(后者#include前者).这不是 "text_?archive.hpp".(结果,我将应用程序的#include行从"binary_?archive_impl.hpp"更改为"text_?archive.hpp".)
2)如果我将"text_?archive.hpp"分成两部分而#include只包含"..._ impl.hpp"标题,那么一切正常.(但我真的不希望修改我的升压安装!)
3)仔细观察这些标题并摆弄一下,我发现如果我使用原始的,未经修改的标题并注释掉该行
BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_oarchive)
Run Code Online (Sandbox Code Playgroud)
(同样如此text_iarchive),然后一切正常.(顺便说一下,我在自己的存档代码中有类似的行来"注册"我的自定义存档.)
神秘和我的困境:
A)为什么这些线条的存在会污染作品?...为什么删除它们会让事情发生变化?......这样做我可能会破坏(不知道)吗?
B)为什么"text_?archive.hpp"文件很久以前就没有与"binary_?archive.hpp"文件一起拆分了?(图书馆坏了吗?应该修好吗?)
C)有没有办法在我的应用程序代码中解决这个问题而不修改我的Boost安装?
PS我正在使用Boost 1.48和Visual Studio 2010(64位)
PPS我想以上所有内容同样适用于text_w?archive
VS2k8中PDB文件的大小限制是多少?我在一个开发工作站上,在32位PAE内核上有3GB的RAM和页面文件,但链接器在PDB增长超过1GB后不久就会发出LNK1201错误.MSPDBSRV是否只是耗尽了地址空间?
我一直在成功使用SWIG来构建一个包装器接口,使我的C++库在C#中可用.最近我暴露了一些boost::optional<>对象,SWIG遇到了问题.有没有一种标准的方法可以解决这个问题?有人必须在此之前碰到这个......
使用Qt Visual Studio插件,它似乎以一种似乎看不见的方式处理了几乎所有事情。不幸的是,它使用msbuild中的CustomBuild步骤进行移动。这导致了一个接一个的串行移动。有没有办法说服msbuild并行执行它们-我已经厌倦了像我一样坐在它们的桂冠上的7个核心。
我已经看过msbuild的BuildInParallel,但是我不确定如何在这里应用它。
msbuild片段:
<Project>
...
<ItemGroup>
<CustomBuild Include="a_class4.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I."</Command>
</CustomBuild>
<CustomBuild Include="a_class3.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I."</Command>
</CustomBuild>
</ItemGroup>
...
</Project>
Run Code Online (Sandbox Code Playgroud) 我从这篇文章中得到了一段代码,我对它是如何工作感到困惑?该片段首先说:
您可以通过测试读取结果来检测特定读取或写入操作是否失败.例如,要检查是否从用户读取了有效整数,可以执行以下操作:
int x;
if ( cin >> x )
{
cout << "Please enter a valid number" << endl;
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为read操作返回对流的引用.
我理解cin >> x操作返回对cin的引用但我仍然感到困惑的是如何评估对标准输入流对象的引用允许您检查输入是否是有效整数.
在你告诉我阅读PEP 0263之前,请继续阅读......
我找不到任何文档,详细说明Python 3源文件支持哪些文件编码.
我发现了数百(数千?)个问题,答案,帖子,电子邮件等,关于如何在源文件的顶部声明该源文件的编码,但没有一个能回答我的问题.忍受我,并想象做(或实际尝试)以下:
print( 'Hello, world!' ))这是我得到的输出:
E:\Temp>python --version
Python 3.4.1
E:\Temp>python "hello.py"
File "hello.py", line 1
SyntaxError: Non-UTF-8 code starting with '\xff' in file hello.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
Run Code Online (Sandbox Code Playgroud)
现在,当我在Notepad ++中打开同一个文件并查看"编码"菜单时,它会选择"在UCS-2 Little Endian中编码"选项. 维基百科告诉我,这基本上是UTF-16编码.随你.我真的不在乎.更多的研究表明,我的编辑器在文件的前面插入了一个两字节的BOM(字节顺序标记),其值为'\ xff\xfe',表示文件编码.所以至少我知道Python抱怨的'\ xff'代码来自哪里.
所以我去网上阅读PEP 0263 - 以及其他一切 - 我尝试在这个文件的第一行添加这样的评论
# coding: utf-16
Run Code Online (Sandbox Code Playgroud)
具有各种不同的编码值,没有任何帮助. 但它无能为力,对吧?因为Python甚至没有达到我的编码声明; 它在源文件的第一个字节上窒息!
所以我真正想知道的是...... …