Windowsで目的のcを学ぼうとしています。私のプログラムは警告付きでコンパイルされます
私のコードは
#include <objc/Object.h>
@interface Greeter:Object
{
/* This is left empty on purpose:
** Normally instance variables would be declared here,
** but these are not used in our example.
*/
}
- (void)greet;
@end
#include <stdio.h>
@implementation Greeter
- (void)greet
{
printf("Hello, World!\n");
}
@end
#include <stdlib.h>
int main(void)
{
id myGreeter;
myGreeter=[[Greeter alloc] init];
[myGreeter greet];
[myGreeter release];
return EXIT_SUCCESS;
}
次のコマンドを使用して、GNUStep でプログラムをコンパイルします。
gcc -o Greeter Greeter.m -I /GNUstep/System/Library/Headers -L /GNUstep/System/Libra
/Libraries -lobjc -lgnustep-base -fconstant-string-class=NSConstantString
コンパイル時に次の警告が表示されます
: 'Greeter' may not respond to '+alloc' [enabled by default]
: (Messages without a matching method signature [enabled by default]
: will be assumed to return 'id' and accept [enabled by default]
: '...' as arguments.) [enabled by default]
: no '-init' method found [enabled by default]
: no '-release' method found [enabled by default]
そのため、実行可能ファイルを実行すると、オブジェクトがインスタンス化されません。
gccバージョンが4.6.2のMinGWのgccを使用しています
- アップデート - -
オブジェクトではなく NSObject から拡張すると、プログラムは正常に動作します
--更新 2 ----
私のObject.hは次のようになります
#include <objc/runtime.h>
@interface Object
{
Class isa;
}
@end
--更新 3 ----
次のようにコードを変更しました。正常にコンパイルされますが、これが正しい方法であるかどうかはわかりません
@interface Greeter
{
/* This is left empty on purpose:
** Normally instance variables would be declared here,
** but these are not used in our example.
*/
}
- (void)greet;
+ (id)alloc;
- (id)init;
- release;
@end
#include <stdio.h>
@implementation Greeter
- (void)greet
{
printf("Hello, World!\n");
}
+ (id)alloc
{
printf("Object created");
return self;
}
- (id)init
{
printf("Object instantiated");
return self;
}
- release {}
@end
#include <stdlib.h>
int main(void)
{
id myGreeter;
myGreeter=[[Greeter alloc] init];
[myGreeter greet];
[myGreeter release];
return EXIT_SUCCESS;
}