приведение CFTypeRef к логическому значению в переполнении стека

Я хочу преобразовать объективный код 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 выпуск).

Вы знаете, каким образом я могу разыграть без отсутствующей функции? Должен ли я попытаться использовать ту же функцию в любом случае?

0

Решение

Objective-C ++ не имеет автоматического связывания фреймворка.
Тебе нужно #include <CoreFoundation/CoreFoundation.h> и вручную связать каркас CoreFoundation.

1

Другие решения

Вы можете использовать этот 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];
}
0

В 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 ++.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector