я считать это ошибка в clang
или компоновщик OSX, но я хотел спросить здесь, чтобы убедиться.
У меня есть следующая (упрощенная) настройка в программе на C ++. Класс синглтон-репозитория:
class Repository {
public:
static Repository *instance();
void registerWidget(const char *name, Widget *w) {}
};
Интерфейс виджета:
class Widget {
public:
virtual void widgetify() = 0;
};
Наконец простой виджет:
class SimpleWidget : public Widget {
public:
virtual void widgetify() {}
};
внутри SimpleWidget
Я хочу зарегистрировать виджет на Repository
во время выполнения автоматически. Обычно я делаю это, используя анонимное пространство имен и функцию регистра. Что-то вроде этого:
namespace {
bool registrar() {
Registrar::instance() -> registerWidget("SimpleWidget", new SimpleWidget);
return true;
}
bool R = registrar();
}
В текущем проекте с использованием Qt
Ориентация на iOS и Android У меня возникла проблема с этой системой. clang
(или компоновщик) идентифицирует SimpleWidget
как мертвый код и удаление его (и, следовательно, он не отображается в Repository
поскольку registrar()
никогда не вызывается.) Кажется, делать это, несмотря на то, что SimpleWidget
явно упоминается в registrar()
, Если я сделаю ссылку на SimpleWidget
в любом из моих других переводческих подразделений, то SimpleWidget
больше не зачищается и все работает правильно.
Я что-то упускаю из-за того, как должно работать удаление мертвого кода, или это законная ошибка в цепочке инструментов?
Все объекты в модуле перевода (например, R) необходимо создать до первого вызова функции в этом модуле перевода (файл .cpp). У вас нет вызова ни одной функции в вашем TU, поэтому R
не нужно создавать, поэтому registrar()
действительно мертвый код, и все, что вызывается исключительно из registrar()
одинаково мертв.
Цепочка инструментов правильная.