gpt4 book ai didi

c++ - gcc - 如何在结构定义中组合 __attribute__((dllexport)) 和 [[nodiscard]]?

转载 作者:行者123 更新时间:2023-11-27 22:33:32 30 4
gpt4 key购买 nike

我有一个标有 C++17 的 [[nodiscard]] 的结构属性。它是这样定义的:

struct [[nodiscard]] MyObject final
{
explicit MyObject(int id);
~MyObject();

MyObject(const MyObject&) = delete;
MyObject& operator=(const MyObject&) = delete;

int id;
};

现在我想从我的动态库中导出它。

在 MSVC 上,语法 struct __declspec(dllexport) [[nodiscard]] MyObject final按预期工作。

但是 GCC 无法同时编译 struct __attribute__((dllexport)) [[nodiscard]] MyObject finalstruct [[nodiscard]] __attribute__((dllexport)) MyObject final : 编译器无法处理这种语法。

语法__attribute__((dllexport)) struct [[nodiscard]] MyObject final编译但似乎没有做我想做的事,因为它会产生以下警告:

:1:49: warning: attribute ignored in declaration of 'struct MyObject' [-Wattributes]

1 | __attribute__((dllexport)) struct [[nodiscard]] MyObject final

| ^~~~~~~~

:1:49: note: attribute for 'struct MyObject' must follow the 'struct' keyword

那么,我怎样才能导出 [[nodiscard]]从 GCC 上的动态库构造?

最佳答案

所有这些都适用于 dllexportdllimport

这似乎是 GCC 解析器中的错误。

Clang manages to parse struct __attribute__((dllexport)) [[nodiscard]] MyObject ... 版本。

正如 @Artyer 所指出的,GCC(和 Clang)支持 dllexport - [[gnu::dllexport]] 的 C++ 语法。

还应注意,Windows 上的 GCC (MinGW) 支持 __declspec(dllexport) 以与 Visual C++ 兼容,并实际解析 class __declspec(dllexport) [[nodiscard]] Test 。 .. 正确(使用 GCC 8.1.0 测试)。


以上所有假设您正在为 Windows 编译,其中 dllexport 实际上意味着什么。在其他平台上,编译器会简单地忽略它(并且通常会发出警告)。

在 Linux 上,应该使用 -fvisibility=hidden 来隐藏除属性 visibility("default") 选择的符号之外的所有符号。没有“导入”替代方案 - 在构建和使用库时都使用 “default”。在 Linux 上导出类时,您不想导出的任何内容都可以标记为 visibility("hidden") 以覆盖类的属性。

GCC 和 Clang 支持 visibility 的两种语法:__attribute__((visibility("default")))[[gnu::visibility("default ")]].

可以在 HERE 中找到有关 GCC 可见性的更多信息。

我不确定从共享库导出符号在 MacOS 上如何工作(可能与在 Linux 上一样?)。

关于c++ - gcc - 如何在结构定义中组合 __attribute__((dllexport)) 和 [[nodiscard]]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57993818/

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