我必须使用MSVC2012和v100平台工具集(来自MSVC2010)构建项目.不幸的是,我在代码中使用C++ 11功能" 基于范围 ".我想知道是否有一个预处理器指令允许在编译时知道当前的平台工具集.即
#if (_MSC_PLATFORM_TOOLSET > 100)
# define ALLOW_RANGE_BASED_FOR 1
#else
# define ALLOW_RANGE_BASED_FOR 0
#endif
Run Code Online (Sandbox Code Playgroud)
我尝试使用_MSC_VER宏,但对于两个平台工具集,它设置为1700(这确实有意义,因为我仍在使用MSVC2012).我很感激任何建议.谢谢.
编译我的iOS应用程序的arm64代码我遇到了一个有趣的问题,与自定义Foundation类型的不同基本类型有关.假设我想printf(或stringWithFormat)一个声明为NSUInteger的数字
[NSString stringWithFormat:@"%u", _depth,
Run Code Online (Sandbox Code Playgroud)
这将为arm64生成一个警告编译,因为NSUInteger为arm64声明为unsigned long.因此,我应该用"%lu"替换"%u",但现在在编译armv7(s)体系结构时这变得无效,因为对于32位体系结构,NSUInteger声明为unsigned int.我知道警告说"NSUInteger不应该用作格式参数",所以让我们继续浮动:
typedef CGFLOAT_TYPE CGFloat;
Run Code Online (Sandbox Code Playgroud)
在64位CGFLOAT_TYPE上是双倍的,而在32位上它是浮点数.因此,做这样的事情:
- (void)foo:(CGFloat)value;
Run Code Online (Sandbox Code Playgroud)
然后
[self foo:10.0f];
[self foo:10.0];
Run Code Online (Sandbox Code Playgroud)
在编译两个体系结构时仍会产生警告.在32位架构上,第二次调用不正确(从double转换为float),在64-bt架构上,第一次将float转换为double(这是好的,但仍然不好).
很想听听你对这个问题的看法.
如何使用我的自定义分配器为所有 Objective-C类正确替换标准/默认内存分配器(不仅适用于我自己的类)?
这不是我的第一需要,更像是我对此感到好奇.现在我最终得到了解决方案,这似乎是有效的,但它是非常不安全的:
@interface NSObject(Allocator)
+ (instancetype)allocWithZone:(_NSZone*)zone;
@end
@implementation NSObject(Allocator)
+ (instancetype)allocWithZone:(_NSZone*)zone
{
(void)zone;
size_t sizeToAlloc = class_getInstanceSize([self class]);
void* allocatedMemory = getSharedObjCAllocator().alloc(sizeToAlloc);
memset(allocatedMemory, 0, sizeToAlloc);
id resultObject = objc_constructInstance([self class], allocatedMemory);
return resultObject;
}
- (void)dealloc
{
objc_destructInstance(self);
if (getSharedObjCAllocator().validatePointer(self, false))
{
getSharedObjCAllocator().free(self);
}
else
{
::free(self);
}
}
@end
Run Code Online (Sandbox Code Playgroud)