8
A
回答
12
如果您对可可或基金会的框架链接,您可以在C代码中使用的Objective-C。但是,如果要使用常规消息传递语法,则必须将文件扩展名从.c更改为.m,以便将其编译为objective-c。如果保留.c扩展名,则只能使用c样式运行时调用与目标对象(即objc_msgSend
,objc_getClass
等)进行交互。
例子:在一个.m文件
void cFunction() {
[[NSString alloc] init];
}
在.c文件
void cFunction() {
void* cls = objc_getClass("NSString");
void* obj = objc_msgSend(cls, NSSelectorFromString(CFSTR("alloc")));
obj = objc_msgSend(obj, NSSelectorFromString(CFSTR("init")));
}
如果你选择了第二种方法,请参阅Objective-C Runtime Reference。
4
目的-C是C的顶部上的非常薄的包装器,编译器只是平移
[obj message:argument];
成C-调用
obj_msgSend(obj,@selector(message:),argument);
,这就是它(其中@selector(message:)
是魔法编码将选择器(方法名称)转换成计算机可理解的东西)。
因此,Objective-C和C之间的编译器观点。例如,您可以使用Objective-C编译器编译纯C程序,其结果与使用C编译器编译时得到的结果完全相同。因此,将Objective-C与C混合的最简单方法是使用.m
扩展,以便编译器使用Objective-C。
这并不会让你的程序突然变得很Objective-C-y。你可以保持你的程序几乎纯C,扩展名为.m
。通过.m
,您可以添加几行Objective-C消息调用而不会出现任何问题。
+0
我能编写一个简单的Makefile来编译和链接它吗? – 2011-05-05 17:51:20
相关问题
- 1. 阻止应用程序通过Cocoa API访问网络(LittleSnitch APIs)?
- 2. 如何使用Objective-C++从Objective-C Cocoa接口调用C++方法
- 3. 使用WebView从Google地图获取Cocoa/Objective-C回调
- 4. 从其他类Cocoa调用IBOutlet
- 5. 如何使用SailsJS调用Google APIs
- 6. Backbone.js多个回调apis
- 7. 在调用Apis时附加参数
- 8. 如何从android程序中调用Assembla REST apis
- 9. Cocoa apis报告可用空间的值不正确,我应该使用什么?
- 10. 如何从Cocoa/WebKit应用程序中的JavaScript调用Objective-C方法?
- 11. 从C++调用C#
- 12. 从C调用C#
- 13. 在javascript中使用chrome apis调用嵌套回调函数
- 14. Objective C Cocoa printing
- 15. 从Azure使用Google Apis函数
- 16. 调用从C++
- 17. 调用从C#
- 18. 调用从C#
- 19. 调用从C#
- 20. 调用从C#
- 21. 在Cocoa应用程序中调用C++ dylib和Header的函数
- 22. 如何从Admin Priveleges bash脚本获得输出,从Cocoa调用?
- 23. Opendaylight RESTful APIs(RESTCONF)
- 24. eclipse调试问题(再次)java apis
- 25. 从非Cocoa应用调用基础,我需要NSRunLoop吗?
- 26. 从Cocoa应用程序
- 27. 从Cocoa应用程序
- 28. 调用javascript - 在Cocoa的WebView中单击()Objective-C代码
- 29. Cocoa/Obj-C - Dateformat change
- 30. html parsing - objective c cocoa
通常情况下,调用'objc_msgSend'是错误的。您应该将其转换为适当的函数类型:'typedef CFStringRef(* StringWithStringIMP)(id,SEL,CFStringRef); CFStringRef string =((StringWithStringIMP)objc_msgSend)(objc_getClass(“NSString”),sel_getUid(“foo”),CFSTR(“This is noless。”));' – 2011-05-05 17:42:48
Cool。我该怎么做呢?我如何链接Cocoa或Foundation框架?它在项目级别吗?我可以'包括'它吗?我想继续只有简单的C文件和一个Makefile来编译它并链接它(不依赖于XCode来完成) – 2011-05-05 17:47:57
@MrAleph你需要告诉GCC链接到框架。使用'-Xlinker -framework -Xlinker Foundation'来执行此操作。您应该执行#include来获取当前的运行时头文件。 –
ughoavgfhw
2011-05-05 18:06:24