Non è possibile evitare di creare un'istanza del runtime Objective-C, ma a quanto pare ne hai già uno.
Se si desidera interagire con il runtime da C, è possibile utilizzare le API runtime Objective-C, come documentato in Objective-C Runtime Programming Guide e Objective-C Runtime Reference.
L'idea è qualcosa di simile (non testata):
#include <objc/runtime.h>
#include <objc/objc-runtime.h>
id allocAndInitAutoreleasePool() {
Class NSAutoreleasePoolClass = objc_getClass("NSAutoreleasePool");
id pool = class_createInstance(NSAutoreleasePoolClass, 0);
return objc_msgSend(pool, "init");
}
void drainAutoreleasePool(id pool) {
(void)objc_msgSend(pool, "drain");
}
Se si desidera chiamare queste funzioni da un altro file, ovviamente dovrete includere objc/runtime.h anche lì. Oppure, in alternativa, puoi lanciare l'id per annullare * nel ritorno dalla funzione allocAndInit, e prendere un void * e ricondurlo all'id nella funzione drain. (Si potrebbe anche inoltrare -dire struct objc_object e typedef struct objc_object * id, ma credo che non sia in realtà garantito la definizione corretta.)
Non si dovrebbe passare a -lobjc nel comando di collegamento.
Inutile dire che probabilmente è meno lavoro solo per fare in modo che gli script di compilazione gestiscano i file .m.
Il tuo problema sta scrivendo un codice obiettivo-c? O avendo i file .m nel tuo progetto quando vuoi solo .c/.cpp? – Sean
Si noti che mentre il codice di @ abarnert è una soluzione praticabile, questo indica un bug nella libreria. Nessuna funzione C o C++ deve chiamare nel codice ObjC senza generare un pool autorelease. Se questo è il codice Apple, dovresti aprire un radar su bugreport.apple.com. –
@Sean Desidero solo file .c/.cpp. So che posso escludere quei file sull'altra piattaforma, ma sto cercando di evitarlo. – fbafelipe