- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个标有 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 final
和 struct [[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 上的动态库构造?
最佳答案
所有这些都适用于 dllexport
和 dllimport
。
这似乎是 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/
C++17 在 p0189r1 中引入了新属性 [[nodiscard]] .当一个函数被这个属性修饰时,返回类型不能被丢弃。如果它被丢弃,则会发出警告。 例子: [[nodiscard]] void
C++17 有一个新属性,[[nodiscard]]。 假设我有一个 Result 结构,它有这个属性: struct [[nodiscard]] Result { }; 现在,如果我调用返回 Res
我想使用第三方函数,它通过充满函数指针的结构提供其 API。例如: struct S { using p_func1 = int(*)(int, int); p_func1 func1
我有一个函数对象,它是另一个函数的包装器: template class Wrapper { private: FuncT funcToWrap; public:
从 C++20 开始,[[nodiscard]]可以应用于构造函数。 http://wg21.link/p1771有例子: struct [[nodiscard]] my_scopeguard { /
在哪些用例中使用 [[nodiscard]] 有益类型? 关于类型,[[nodiscard]]如果任何返回该类型实例的函数的返回值被省略,则发出警告; (引自 p0068r0): If [[nodis
我正在尝试测试一些 C++17。我正在尝试: [[nodiscard]] int get_value1() { return 42; } inline void start() { /
C++17 标准中引入的 [[nodiscard]] 属性,如果是 ... potentially-evaluated discarded-value expression,..., implemen
应用于函数时,[[nodiscard]]属性鼓励编译器在被丢弃的表达式中使用而不是强制转换为 void 时发出警告。示例: [[nodiscard]] int callable_return_not_
说我有 [[nodiscard]] int foo () { return 0; } int main () { foo (); } 然后 error: ignoring return
在 C++ 中,我们可以使用“[[nodiscard]]”来装饰我们的返回类型,如果结果未使用,则会触发编译器警告。 这对于强制执行错误代码特别有用 auto dont_forget_to_check
由于 this问题和答案,属性是否被继承并不是 100% 清楚,但可能不是,因为它没有在标准中说明。这就是为什么如果我们只有标记为 nodiscard 的声明在基类中,并使用 Clang 编译,如果我
我想防止人们在不处理返回值的情况下调用 lambda。 Clang 4.0 拒绝我尝试过的一切,使用 -std=c++1z 进行编译: auto x = [&] [[nodiscard]] () {
我有一个 C++ 项目,其中 clang-tidy建议添加[[nodiscard]]到处。这是一个好习惯吗?我的理解是[[nodiscard]]仅当忽略返回值对程序可能是致命的时才应使用。我有一个对象
我想知道是否有办法拥有这样的东西: using CallbackType = std::function; (我知道上面的代码不会被编译并提示 nodiscard 不能应用于类型!) 我的目标是强制回
您可以使用 [[nodiscard]] 属性声明一个类。当您从此类的语义中知道无论何时从函数返回它都必须用于某些事情时,它可能很有用。我有这种情况,用 [[nodiscard]] 标记类而不是返回它的
C++17 已添加 [[nodiscard]] . C++20 添加了 [[nodiscard]] 的使用在 empty方法,例如 vector::empty() -- 可能是为了避免用户混淆 cle
我有一个标有 C++17 的 [[nodiscard]] 的结构属性。它是这样定义的: struct [[nodiscard]] MyObject final { explicit MyObj
我需要非 C++17 代码库中 [[nodiscard]] 属性的语义。我想在 C++17 之前有依赖于编译器的方法可以实现这一点。有谁知道这些?我对 clang、gcc 和 MSVC 感兴趣。 最佳
最近发布了 Visual Studio 2019 的 16.9.5 版本。它显然引入了新的警告: [[nodiscard]] __declspec(dllexport) bool foo(); //o
我是一名优秀的程序员,十分优秀!