在我们的应用程序中,我们有一些(成员,但这应该无关紧要)函数声明为
void SomeFunction(Type argument) throw (...);
Run Code Online (Sandbox Code Playgroud)
用Microsoft Visual C++编译就好了.但现在我正在尝试使用GCC编译它并拒绝...as语法错误.我记得很久以前就听说过这个结构,但是看看规范,C++ 03和C++ 11似乎都不允许...这样,我不记得从哪里得到它.有没有人知道这个(显然没有意义)构造的起源?
Android系统是否应该在应用程序运行时升级时重新启动应用程序?
当我们升级我们的应用程序(通过从SD卡打开.apk)并且应用程序正在运行时,现有进程保持不变,直到我们从应用程序管理器"强制关闭"应用程序之后升级才会生效.但是,应用程序可能处于某种奇怪的状态,并且可能无法应对它应该采取的某些意图.所以我想知道如果我们修复那个特定的破坏状态或者我们是否需要自己处理升级,应用程序是否会重新启动.
请注意,我知道(或至少有一些想法)如何以编程方式检测升级.我想知道的是,如果应用程序处于一个理智状态,我是否应该或是否有其他机制应该这样做.
我们有一个针对多个移动平台的复杂C++代码库.我们目前有Windows CE(原始CE和移动版本为4.2到6.5),Android(2.1 +),iPhone(4 +),几乎可以使用Bada(2.0+),如果有新的C++/CX,可能会添加Windows Phone(8+).加上Win32上的测试版和Win64 上的服务应用程序共享一些代码.我们也已经尝试在Linux上编译单元测试,并且已经出现了问题(到目前为止业务量太小,但可能会有所改变),以使其在其他Linux平台上运行.
我们目前使用每个平台的本机工具编译代码.它们中的每一个都非常复杂,并且在其中或周围有一些黑客可以实现合理的单击构建.而对于Bada来说,我们还没有解决三星调整过的Eclipse之外的版本,我们必须为生产做些什么.
到目前为止它的工作原理,但正在变得越来越多的维护问题.目前最大的问题是iPhone构建,因为与Visual Studio项目文件和普通makefile不同,它不可能手动添加/删除/重命名XCode项目中的文件,只有两个人拥有MacOS boxen和任何XCode的经验(虽然每个人都有Windows并且知道Visual Studio).我们还需要为Bada目标创建一些makefile(它是普通的GNU工具链,所以任何能够与那些交叉编译的东西都应该这样做)并且我不会在中期摆脱Android构建中的一些kludges:修复bug在cygwin下构建时的依赖性处理,在ant构建脚本和shell胶水之上的一些hacks按摩清单并将它们保持在一起.
因此,我正在寻找有关如何统一这组不同平台的构建过程的建议.
对于其他我准备解决任何缺陷的事情,但我显然希望保持壳管胶带和吐出的量最小,所以它应该:
到目前为止,我们已经开始尝试CMake(没有太多时间,因此没有达到目标,但很快就要做一些事情)并且还考虑了SCons.但是几年前我已经尝试使用SCons for Windows CE构建,但是因为它为Visual Studio生成了makefile类型的项目,而那些在VS2005中不适用于嵌入式平台,所以我放弃了.CMake可以生成本机makefile,但CE需要一个定制的,过时的分支.所以我想问一下我们可能想要查看的其他工具,或者我们应该注意这些工具的任何已知绊脚石.
更新:我在几个地方找到了android原生二进制文件的说明,pixellight甚至有cmake脚本通过直接调用打包工具生成apk.另外这个shell脚本显示它. 这里似乎记录了iPhone的使用情况.
我需要从绑定成员函数创建一个谓词,所以我将它包装在一个boost::function<bool(SomeObject const &)>.这看起来很好,但是我还需要在一个案例中否定它.然而
boost::function<bool(SomeObject const &)> pred;
std::not1(pred);
Run Code Online (Sandbox Code Playgroud)
不能在MSVC++ 9.0(Visual Studio 2008)下编译,抱怨对引用的引用无效:
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\functional(213) : warning C4181: qualifier applied to reference type; ignored
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\functional(213) : error C2529: '_Left' : reference to reference is illegal
Run Code Online (Sandbox Code Playgroud)
问题是boost::function定义argument_typeas SomeObject const &和std::unary_negate<_Fn1>实例化由std::not1内部尝试使用const typename _Fn1::argument_type&和编译器拒绝它因为T::argument_type已经是一个引用.我确信这应该在C++ 11下编译,但这只是旧的编译器,只是C++ 03.所以我想知道它是谁的错:
unary_negate了const typename Predicate::argument_type& x参数),argument_type即使实际参数是或者,也不应该引用 …最近,64位ARM手机开始出现.但是构建64位应用程序有什么实际优势吗?特别考虑对增加的虚拟地址空间¹没有多大用处的应用程序,但由于指针大小的增加会浪费一些空间.
那么ARM64除了实际上需要构建这样的64bit应用程序的更大地址之外还有其他任何优势吗?
注意:我已经看到了64位性能优势,但它只提到了x86-64,除了扩展虚拟地址空间之外还有其他改进.我还记得情况确实特定于x86和其他一些像Sparc一样64位的平台,通常的做法是只编译内核和实际使用大量内存作为64位的应用程序,其他一切都是32位.
¹ 该应用程序是多平台的,它仍然需要在只有48MiB内存的设备上构建和运行.它有一些从外部存储读取的大数据,但它一次不需要超过几兆字节.
如果带有枚举类型参数的开关错过了某些常量并且没有默认分支,则gcc -Wswitch选项会引发类似警告
warning: enumeration value 'WHATEVER' not handled in switch
Run Code Online (Sandbox Code Playgroud)
但是,我们的许多开关都是这样的:
enum foo {
FOO_ONE,
FOO_TWO,
FOO_COUNT
};
Run Code Online (Sandbox Code Playgroud)
其中FOO_COUNT永远不会显示为值,但用于了解已定义并可能出现在变量中的值的数量.因为我们使用枚举值索引数组或对其进行位打包,并且需要检查它是否适合.因此,处理所有值的枚举应该不包括这一个常数.有没有办法保持警告,但避免这种特殊值?即
switch(foo) {
case FOO_ONE:
anything;
};
Run Code Online (Sandbox Code Playgroud)
应该发出警告,但是:
switch(foo) {
case FOO_ONE:
anything;
case FOO_TWO:
anything_else;
}
Run Code Online (Sandbox Code Playgroud)
应该不是.
Microsoft运行时库提供分配函数的调试版本.对于C++,这是具有签名的operator new的调试变体:
void *operator new(size_t size, int blockType, const char *filename, int linenumber);
Run Code Online (Sandbox Code Playgroud)
并且宏被定义为
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)
现在要对所有分配进行检测,通常可以定义
#if defined DEBUG_NEW
#define new DEBUG_NEW
#endif
Run Code Online (Sandbox Code Playgroud)
但是,这个定义会破坏使用placement new的任何地方,因为这两组参数最终都是语法错误.现在,我可以轻松处理代码中的少数用法,但标准库和boost使用新的位置.因此,定义全局意味着在定义之前包含许多内容并且会减慢编译速度.
那么有没有办法在我们的代码中设置分配而不是仅仅因为它们包含新的放置而不必将上一个定义放在所有文件中或者手动编写DEBUG_NEW?
我理解使用NETFX_CORE指令,如下所示:
#if NETFX_CORE
// Windows 8
#else
// Windows Phone 8
#endif
Run Code Online (Sandbox Code Playgroud)
更多信息:http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj714084(v=vs.105).aspx
但有没有针对Windows Phone 8的指令?
Windows上的ViM本地构建在文件路径中使用反斜杠,包括完成,但如果我手动使用正斜杠(事实上所有Windows API都理解它们,cmd.exe是唯一的例外)它可以正常工作,并且反斜杠会导致各种问题,因为它们会成为转义的两倍并且"dwim"逻辑并不真正起作用.例如:
:vimgrep /Foo/ src/*
Run Code Online (Sandbox Code Playgroud)
工作得很好,但是
:vimgrep /Foo/ src\*
Run Code Online (Sandbox Code Playgroud)
没有,因为\逃脱了*.手动我只是写正斜杠,但制表完成总是给我反斜杠,所以我必须一直改变它.
是否可以在默认情况下重新配置ViM以使用正斜杠(最好不重新编译)?
像这样的代码过去常常起作用,它应该是什么意思.是否允许编译器(通过规范)使其成为错误?
我知道它正在失去精确度,我会很高兴收到警告.但是它仍然有一个明确定义的语义(至少对于未定义的缩小版本定义)并且用户可能想要这样做.
我有遗留代码,我不想重构太多,因为它相当棘手并且已经调试过.它做了两件事:
有时在指针变量中存储整数.如果代码之前存储了整数,则代码仅将指针强制转换为整数.因此,当演员阵容缩小时,溢出在现实中永远不会发生.代码经过测试和运行.
当存储整数时,它总是适合普通的旧无符号,因此改变类型不被认为是一个好主意并且指针传递相当多,所以改变它的类型将有点侵入性.
使用地址作为哈希值.一个相当常见的事情.哈希表对于扩展类型没有任何意义.
代码使用plain unsigned作为哈希值,但请注意,更常见的类型size_t 仍可能生成错误,因为无法保证sizeof(size_t)> = sizeof(void *).在具有分段内存和远指针的平台上,size_t只需要覆盖偏移部分.
那么什么是最不易侵入的合适的解决方法?已知代码在使用不会产生此错误的编译器编译时工作,所以我真的想要进行操作,而不是更改它.
void *x;
int y;
union U { void *p; int i; } u;
Run Code Online (Sandbox Code Playgroud)
*(int*)&x并且u.p = x, u.i是不等同于(int)x并且不相反(void *)y.在大端架构上,前两个将返回较低地址上的字节,而后一个将处理低位字节,这些字节可能驻留在较高地址上.*(int*)&x并且u.p = x, u.i都是严格别名侵犯,(int)x是不是.