2013-10-14 2 views
1

Я знаю, что это простой вопрос, но я ищу, чтобы мой паз C++ был включен. Я бы предположил, что можно использовать функцию abort. Но я не думаю, что вернет любой текст, например die('hello');.Есть ли эквивалент C++ для PHP var_dump и умереть?

+1

Печатайте текст и * затем * выходите? – Ryan

+0

Правильно, это будет один из способов. Было просто интересно, есть ли команда для этого И распечатать – Shamoon

ответ

7

Нет «распечатать сообщение, а затем выйти» на C или C++. Вы можете довольно легко написать собственную функцию для die (или panic, как я предпочитаю называть его), что-то вроде:

void die(const std::string& msg) 
{ 
    std::cerr << msg << std::endl; 
    exit(1); 
} 

Или, если вы хотите, чтобы избежать проблем с созданием строки, которые могут разрушаться под условия низкой памяти:

void die(const char *msg) 
... 

(остальное должно быть таким же, как указано выше). Недостатком здесь является то, что вы не можете тривиально конкатенировать строки, например. die(std::string("Could not open file ") + filename); не будет работать с const char *.

Функция, которая делает var_dump, намного сложнее, так как нет прямого способа получить содержимое переменной произвольного типа или массива в C++. Вы могли бы, возможно, сделать что-то вроде этого:

template<typename T> 
void var_dump(const T& var) 
{ 
    std::cout << var << endl; 
} 

template<typename T, size_t N> 
void var_dump(const T (&var)[N]) 
{ 
    for(i : var) 
    { 
     std::cout << i << endl; 
    } 
} 

Последнее немного, как этот PHP код: foreach($var as $i) echo $i . "\n";. И я могу иметь синтаксис немного неправильно, не уверен.

+0

Я бы не использовал 'std :: string' здесь, в условиях отказа он, скорее всего, потерпит неудачу еще сильнее. –

+0

@BenVoigt: если «Failure» не хватает памяти, возможно, да. Для большинства других сбоев, возможно, нет ... Я изменил его на ссылку 'const', которая должна избежать необходимости делать копию. –

+0

Кроме того, любые сбои, связанные с повреждением кучи. Для регистрации ошибок нецелесообразно предполагать программу с четко определенным поведением. –

2

Я бы не рекомендовал звонить std::abort, std::exit или что-нибудь в этом роде.

Это грубая сила, и семантика для правильной очистки очень сложна. Вы существенно уходите (по крайней мере, части) своей программы в очень грязное состояние.

Намного лучше в C++, чтобы бросить исключение, которое вы затем поймать в main:

#include <stdexcept> 

struct fatal_error : std::logic_error { 
    fatal_error(char const* message) : std::logic_error(message) { } 
}; 

int main() try { 
    … the normal program flow starts here 
} catch (fatal_error const& e) { 
    std::cerr << e.what() << '\n'; 
    return EXIT_FAILURE; 
} 

Тогда вместо die, вы бы просто сказать throw fatal_error("Something went wrong.");.

+0

+1 PHP не известен как вершина хорошего дизайна ... – GManNickG

+0

* «Бросьте исключение, которое вы затем поймаете в' main' »* - Er, no. Почему безоговорочно поймать исключение, которое вы не знаете, как обращаться? Нет, просто пусть это пройдет, если вы не знаете, что делать. Кстати, это намного ближе к тому, что просит ОП.Семантика для неперехваченных исключений в C++ в наши дни довольно хорошо определена. – IInspectable

+0

@Инспективный Когда этот ответ был написан, исключенные исключения привели к неопределенному или неопределенному (не помню, какое) поведение и утечка ресурсов. Но, кроме того, ни один конечный пользователь не хочет получать результат от неперехваченного исключения. Гораздо лучше сохранить контроль над форматированием. –

0

Предполагая, что вам нужны эти эквиваленты для отладки цели ...

вместо фильеры() вы можете ссылаться отладчик;

вместо var_export() вы можете проверить содержимое ваших переменных с помощью отладчика.

+0

Не использовать VC++. Итак, как я могу вызвать отладчик? – Shamoon

+0

http://www.hermetic.ch/cfunlib/debug.htm – Paolo

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