Я хочу преобразовать объективный код c в целевой cpp и использовать его в своем приложении. Учитывая следующий код:
CFTypeRef dynamicValue = (__bridge CFTypeRef)([[NSBundle bundleWithPath:aStr] objectForInfoDictionaryKey: @"CFPlugInDynamicRegistration"]);
BOOL removeFlag = NO;
if(dynamicValue == nil)
{
removeFlag = NO;
}
else if( CFGetTypeID(dynamicValue) == CFBooleanGetTypeID() )
{
removeFlag = CFBooleanGetValue(dynamicValue);
}
else if( CFGetTypeID(dynamicValue) == CFStringGetTypeID() )
{
removeFlag = ( [[(__bridge NSString*)dynamicValue lowercaseString] isEqualToString:@"yes"] ? YES:NO);
}
if( removeFlag )
{
[unloadedArray addObject:aStr];
[sortedArray removeObjectAtIndex:hoge];
}
Я получаю сообщение об ошибке при изменении имени файла с file.m на file.mm и построении: «нет соответствующей функции для вызова CFBooleanGetValue»
Я пытался #include <CoreFoundation/CFNumber.h>
но я получаю ту же ошибку (я думаю, это ifdef
выпуск).
Вы знаете, каким образом я могу разыграть без отсутствующей функции? Должен ли я попытаться использовать ту же функцию в любом случае?
Objective-C ++ не имеет автоматического связывания фреймворка.
Тебе нужно #include <CoreFoundation/CoreFoundation.h>
и вручную связать каркас CoreFoundation.
Вы можете использовать этот CFNumberGetTypeID ()
NSString *aStr = @"";
CFTypeRef dynamicValue = (__bridge CFTypeRef)([[NSBundle bundleWithPath:aStr] objectForInfoDictionaryKey: @"CFPlugInDynamicRegistration"]);
BOOL removeFlag = NO;
if(dynamicValue == nil)
{
removeFlag = NO;
}
else if( CFGetTypeID(dynamicValue) == CFNumberGetTypeID() )
{
removeFlag = [(__bridge NSNumber *)dynamicValue boolValue];
}
else if( CFGetTypeID(dynamicValue) == CFStringGetTypeID() )
{
removeFlag = ( [[(__bridge NSString*)dynamicValue lowercaseString] isEqualToString:@"yes"] ? YES:NO);
}
if( removeFlag )
{
[unloadedArray addObject:aStr];
[sortedArray removeObjectAtIndex:hoge];
}
В C ++ преобразование из void *
(Вот: CFTypeRef
) к
указатель другого типа (здесь: CFBooleanRef
ака __CFBoolean *
) требует явного
бросать. Так что это решит проблему:
removeFlag = CFBooleanGetValue(static_cast<CFBooleanRef>(dynamicValue));
Но на самом деле я бы забыл о CF
типы и мосты, и измените код на
id dynamicValue = [[NSBundle bundleWithPath:@"path"] objectForInfoDictionaryKey: @"CFPlugInDynamicRegistration"];
BOOL removeFlag = NO;
if ([dynamicValue isKindOfClass:[NSNumber class]]) {
removeFlag = ((NSNumber *)dynamicValue).boolValue;
} else if ([dynamicValue isKindOfClass:[NSString class]]) {
removeFlag = [((NSString *)dynamicValue).lowercaseString isEqualToString:@"yes"];
}
Это компилируется в Objective-C и Objective-C ++.