No sé si esto es posible, pero teniendo el código en C simple, ¿es posible llamar a API Cocoa?
Algo como #include <cocoa.h>
, agregue la biblioteca correspondiente y vaya a buscarla?Llamando API Cocoa desde C
Gracias por la ayuda
No sé si esto es posible, pero teniendo el código en C simple, ¿es posible llamar a API Cocoa?
Algo como #include <cocoa.h>
, agregue la biblioteca correspondiente y vaya a buscarla?Llamando API Cocoa desde C
Gracias por la ayuda
Si se enlaza contra los marcos de cacao o fundación, puede utilizar Objective-C dentro de su código C. Sin embargo, si desea utilizar la sintaxis de mensajería normal, deberá cambiar la extensión de archivo de .c a .m para que se compile como objetivo-c. Si mantiene la extensión .c, solo podrá usar las llamadas en tiempo de ejecución de estilo c para interactuar con objetos objetivo (es decir, objc_msgSend
, objc_getClass
, etc.).
Ejemplos: Dentro de un archivo .m
void cFunction() {
[[NSString alloc] init];
}
dentro de un archivo .c
void cFunction() {
void* cls = objc_getClass("NSString");
void* obj = objc_msgSend(cls, NSSelectorFromString(CFSTR("alloc")));
obj = objc_msgSend(obj, NSSelectorFromString(CFSTR("init")));
}
Si elige el segundo método, consulte la Objective-C Runtime Reference.
Objective-C es un envoltorio muy delgada en la parte superior de C. El compilador simplemente traduce
[obj message:argument];
en un C-llamar
obj_msgSend(obj,@selector(message:),argument);
y eso es todo (donde @selector(message:)
es una codificación de la magia convirtiendo un selector (nombre del método) en una cosa comprensible para la computadora.)
Como tal, no hay mucha diferencia entre Objective-C y C del compilador punto de vista Por ejemplo, puede compilar un programa C puro con un compilador Objective-C, con exactamente el mismo resultado que obtener compilando con un compilador C.
Entonces, la manera más fácil de "mezclar" un poco de Objective-C con C es usar la extensión .m
para que el compilador use Objective-C.
Eso no hace que su programa sea repentinamente muy Objective-C-y. Puede mantener su programa casi puro C, con la extensión .m
. Con .m
, puede agregar algunas líneas de llamadas al mensaje Objective-C sin problemas.
¿Sería capaz de escribir un simple Makefile para compilar y vincular esto? –
En general, llamar a 'objc_msgSend' tal como está es incorrecto. Debe convertirlo a un tipo de función apropiado: 'typedef CFStringRef (* StringWithStringIMP) (id, SEL, CFStringRef); CFStringRef string = ((StringWithStringIMP) objc_msgSend) (objc_getClass ("NSString"), sel_getUid ("foo"), CFSTR ("Esto no tiene sentido")); ' –
Cool. ¿Cómo hago esto? ¿Cómo puedo vincularme con el marco de Cocoa o Foundation? ¿es a nivel de proyecto? puedo '#incluir'? Me gustaría continuar teniendo solo archivos C simples y un Makefile para compilarlo y vincularlo (sin depender de XCode para hacerlo) –
@MrAleph Necesitarás decirle a GCC que vincule con el framework. Utilice '-Xlinker -framework -Xlinker Foundation' para hacer esto. Debe hacer '#include' para obtener el encabezado de tiempo de ejecución actual. –
ughoavgfhw