Начиная использовать предложение googletest ASSERT_THROW, кажется, что «иногда» обрабатывается базовый тип сгенерированного исключения.Я сократил соответствующий раздел кода до этого:
// myexception.h
struct myexception : public std::logic_error {
myexception(const char* what):std::logic_error(what){}
};
void throwMy();
// myexception.cpp
void throwMy(){ throw myexception(NULL); }
Это мой тестовый код:
//
void localThrowMy(){ throw myexception(""); }
// test code, based upon the ASSERT_THROW macro
try {
throwMy(); // outputs "logic_error"
//localThrowMy(); // would output "what I expected"
}
catch( myexception & ) { cout << "what I expected"; }
catch( std::logic_error & ) { cout << "logic_error"; } // my addition
catch(...) { cout << "mmmh."; }
Странная вещь: если я объявляю функцию throwMy
в той же компиляцииблок в качестве тестового кода, «то, что я ожидал» выводится.Если он находится в другом модуле, тест выдает «logic_error.».
- g ++ --version: (Debian 4.4.5-8) 4.4.5
- ld --version:(GNU Binutils для Debian) 2.20.1-system.20100303
Является ли этот код правильным?Может ли компоновщик быть здесь ошибочным?