gpt4 book ai didi

c++ - Clang 错误地删除死代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:54 25 4
gpt4 key购买 nike

认为这是 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 和注册函数来执行此操作。像这样:

namespace {
bool registrar() {
Registrar::instance() -> registerWidget("SimpleWidget", new SimpleWidget);
return true;
}

bool R = registrar();
}

在当前使用针对 iOS 和 Android 的 Qt 的项目中,我遇到了这个系统的问题。 clang(或链接器)将 SimpleWidget 识别为死代码并将其剥离(因此它不会出现在 Repository 中,因为 registrar() 从未被调用。)尽管在 registrar() 中显然引用了 SimpleWidget,但它似乎这样做了。如果我在我的任何其他翻译单元中引用 SimpleWidget,则 SimpleWidget 不再被剥离并且一切正常。

我是否遗漏了一些关于死代码剥离应该如何工作的信息,或者这是一个合法的工具链错误?

最佳答案

翻译单元(例如 R)中的所有对象都需要在第一次调用该翻译单元(.cpp 文件)中的函数之前创建。您没有调用您的 TU 中的单个函数,因此不需要创建 R,因此 registrar() 确实是死代码,任何调用独家来自 registrar() 同样死了。

工具链是正确的。

关于c++ - Clang 错误地删除死代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27927545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com