2011-05-05 23 views
8

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

Respuesta

12

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.

+4

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")); ' –

+0

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) –

+1

@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

4

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.

+0

¿Sería capaz de escribir un simple Makefile para compilar y vincular esto? –