为什么这段代码适用于clang而不适用于gcc?

时间:2014-03-07 17:31:47

标签: objective-c gcc clang

这里有一段代码我在一个论坛中找到了一个关于在Objective-C中使用gcc在Ubuntu(而不是clang)上进行编程的代码,但它只适用于clang(在Ubuntu上)! 从代码中你很容易理解这是我第一次尝试在Objective-C中做一些事情(我知道C和C ++,这个尝试对于iOS的未来编程来说是有道理的)

// prova.m
#import <objc/Object.h>
#import <stdio.h>

@interface Number: Object
{
@public
    int number;

}

- (void)printNum;

@end

@implementation Number: Object


- (void)printNum
{
    printf("%d\n", number);
}

@end

int main(void)
{
    Number *myNumber = [Number new]; // equal to [[Number alloc] init]

    myNumber->number = 6;

    [myNumber printNum];

    return 0;
}

这在clang中运行正常但在gcc中它会编译并发出警告并在执行时出现分段错误。

$ gcc -o prova.out prova.m -lobjc
prova.m: In function ‘main’:
prova.m:28:5: warning: ‘Number’ may not respond to ‘+new’ [enabled by default]
prova.m:28:5: warning: (Messages without a matching method signature [enabled by default]
prova.m:28:5: warning: will be assumed to return ‘id’ and accept [enabled by default]
prova.m:28:5: warning: ‘...’ as arguments.) [enabled by default]
$ ./prova.out
Errore di segmentazione (core dump creato)

1 个答案:

答案 0 :(得分:3)

Object;哇。那是老派。

除非您的Object类定义了+new类方法,否则您的子类不会响应该方法。您需要实施new或取消对new的调用。

它正在使用一个编译器进行编译,但不是其他气味,就像您正在编译运行时的两个不同版本。