Лучший подход, по моему скромному мнению, должен был бы избежать специального теста. Большинство раз использование генератора тест:
thing_generated = False
# Nothing is lost here. if nothing is generated,
# the for block is not executed. Often, that's the only check
# you need to do. This can be done in the course of doing
# the work you wanted to do anyway on the generated output.
for thing in my_generator():
thing_generated = True
do_work(thing)
, Если это не достаточно хорошо, можно все еще выполнить явный тест. На данном этапе thing
будет содержать последнее сгенерированное значение. Если ничто не было сгенерировано, это будет не определено - если Вы уже не определили переменную. Вы могли проверить значение thing
, но это немного ненадежно. Вместо этого просто установите флаг в блоке и проверьте его позже:
if not thing_generated:
print "Avast, ye scurvy dog!"
Вы можете написать
new(foo, bar) MyClass;
В этом случае вызывается следующая функция
void*operator new(std::size_t, Foo, Bar){
...
}
. Теперь вы можете вызвать
new(__LINE__, __FILE__) MyClass;
и использовать данные с помощью
void*operator new(std::size_t, unsigned line, const char*file){
...
}
. Добавление макроса
#define new new(__LINE__, __FILE__)
в отслеживаемый код перехватит большинство вызовов без необходимости изменения исходного кода.
Это не идеально, например, вы могли бы вызвать оператора new напрямую. В этом случае препроцессор превратит ваш код в мусор. Но я не знаю лучшего способа.
Нет, вы не можете сделать
#define new new(__FILE__, __LINE__)
, но можете:
#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW
посмотрите на: http://sourceforge.net/projects/nvwa/