Определения Ivar показывают кодировку типа long как кодировку типа long long - PullRequest
0 голосов
/ 18 марта 2010

Я обнаружил, как мне кажется, ошибку в среде выполнения Ivar и Objective-C. Я использую XCode 3.2.1 и связанные библиотеки, разрабатываю 64-битное приложение для X86_64 (MacBook Pro).

Когда я ожидал бы, что кодировка типа для следующего "longVal" будет "l", кодировка Ivar показывает "q" (это "long long").

Кто-нибудь еще видел это? Упрощенный код и вывод следующие:

Код:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface Bug : NSObject
{
    long        longVal;
    long long   longerVal;
}
@property (nonatomic,assign) long longVal;
@property (nonatomic,assign) long long longerVal;
@end

@implementation Bug

@synthesize longVal,longerVal;

@end


int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    unsigned int    ivarCount=0;
    Ivar *ivars= class_copyIvarList([Bug class], &ivarCount);

    for(unsigned int x=0;x<ivarCount;x++) {
        NSLog(@"Name [%@] encoding [%@]",
         [NSString stringWithCString:ivar_getName(ivars[x]) encoding:NSUTF8StringEncoding],
              [NSString stringWithCString:ivar_getTypeEncoding(ivars[x]) encoding:NSUTF8StringEncoding]);
    }

    [pool drain];
    return 0;
}

А вот вывод из консоли отладки:

This GDB was configured as "x86_64-apple-darwin".tty /dev/ttys000
Loading program into debugger…
sharedlibrary apply-load-rules all
Program loaded.
run
[Switching to process 6048]
Running…
2010-03-17 22:16:29.138 ivarbug[6048:a0f] Name [longVal] encoding [q]
2010-03-17 22:16:29.146 ivarbug[6048:a0f] Name [longerVal] encoding [q]
(gdb) continue

Не красивая картинка!

- Фрэнк

Ответы [ 2 ]

2 голосов
/ 18 марта 2010

Это не ошибка. Компилятор GCC в 64-битной архитектуре выбирает представление long s как 64-битные целые числа. Вы можете проверить это сами:

printf("%lu\n", sizeof(long)); // will give "8"

Напоминаем, что стандарт C определяет минимальные размеры только для целочисленных типов. long гарантированно будет иметь длину не менее 32 бит.

0 голосов
/ 18 марта 2010

Mac OS X, Linux и большинство других 64-разрядных операционных систем используют модель LP64 , где длинные и указатели 64-разрядные, а целые 32-разрядные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...