2012-03-27 2 views

ответ

3

Core Foundation имеет макрос HALT, который должен сделать трюк, если вы действительно, действительно думаю, что это нужно сделать это:

#if defined(__ppc__) 
    #define HALT do {asm __volatile__("trap"); kill(getpid(), 9); } while (0) 
#elif defined(__i386__) || defined(__x86_64__) 
    #if defined(__GNUC__) 
     #define HALT do {asm __volatile__("int3"); kill(getpid(), 9); } while (0) 
    #elif defined(_MSC_VER) 
     #define HALT do { DebugBreak(); abort(); } while (0) 
    #else 
     #error Compiler not supported 
    #endif 
#endif 
#if defined(__arm__) 
    #define HALT do {asm __volatile__("bkpt 0xCF"); kill(getpid(), 9); } while (0) 
#endif 
+0

Это хорошо, но есть некоторые проблемы. Команды asm являются, по существу, генераторами останова, что отлично, если вы ожидаете подключения отладчика, но, возможно, не того, что вы хотите в противном случае (то есть: в окнах он по умолчанию запускает диалог сбоя/отладки). О, MSC, вызывающий abort(), в порядке, но все еще имеет больше инфраструктуры/cruft, чем TerminateProcess() – Joe

+0

@Joe: Я не думаю, что делать это каким-либо образом - это хорошая идея вообще. CF использует этот макрос только для фатальных ошибок. Правильный ответ на вопрос, насколько мне известно, - «Да, но вы не должны». Обратите внимание, что я не писал их, и что они активно используются. –

+0

Это делает трюк красиво! Спасибо! @Joe: генераторы точек останова * идеально подходят для моего случая. – andyvn22

1

Если вы используете приложение Macintosh, «[[NSApp sharedApplication] terminate: self]» будет работать.

На iPhone, вы можете даже сделать «exit(-1)», но Apple, будет НЕ принимать какие-либо приложения, которые внезапно или каким-либо образом оканчиваются кроме пользователя убивая сами приложения. Here is a related question with some useful answers for you.

0

Предполагая, что вам не нравится выход() или _exit (), которые имеют некоторые очистки семантики, вы можете пойти с с

#include <signal.h> 

kill(getpid(), SIGKILL); 

И если вы на окнах (предполагается, что не так «какао» отмеченном), вы можете использовать

TerminateProcess(GetCurrentProcess(), -1); 

Это все довольно суровое, поэтому все должно быть довольно плохо для этого.

Смежные вопросы